library(tibble)
library(readxl)
library(dplyr)
library(gtExtras)
library(ggplot2)
library(plotly)
library(viridis)
library(hrbrthemes)
library(openxlsx)


#data <- readxl::read_xlsx ("BPAs_FDTs_ RAVLTs_EscoreZ.xlsx", sheet = 1)


#install.packages("tibble")
#install.packages("openxlsx")




#setwd("C:/Users/User/Desktop/Analysis in R/NeuroCovid")

getwd()
[1] "C:/Users/felip/Desktop/R/4_analise_"
data <- readxl::read_xlsx ("DADOS_BRUTOS_COVID_LONGA_PREENCHENDO.xlsx")

data <- na.omit(data)

 
################################## BPA Z-Score Calculating  #####################################

                                # 1º Try
                  # TENTATIVA DE CRIAĂ‡ĂƒO DE FUNĂ‡ĂƒO

cbind(data)

calcular_z_score <- function(x, media, desvio_padrao) {
  if (x >= 21 & x <= 30) {
    z_score <- (x - media) / desvio_padrao
    return(z_score)
  }
}

                                # 2º Try

# Definir os valores constantes de mĂ©dia e desvio padrĂ£o para cada faixa etĂ¡ria
constantes <- tribble(
  ~LIMIT_AGE, ~media_constante, ~desvio_padrao_constante,
  "18-20", 85.79, 22.53,
  "21-30", 87.08, 21.50,
  "31-40", 85.48, 22.56,
  "41-49", 80.72, 22.85
)

                                # 3º Try
  # COMEÇAR DAQUI ----->  DETERMINANDO LIMITES A SEREM APLICADOS

limites_idade <- c(18, 20, 30, 40, 50)


data <- data %>%
  mutate(LIMIT_AGE = cut(AGE, breaks = limites_idade, labels =
                           c("18-20", "21-30", "31-40", "41-50"))) %>% 
  arrange(AGE)
  
data

# Calcular o Z-score usando as constantes para cada faixa etĂ¡ria


#BPA_CONC

BPA_CONC_EscoreZ <- data %>%
  mutate(BPA_CONC_EscoreZ = case_when(
    LIMIT_AGE == "18-20" ~ (BPA_CONC_POINTS - 85.79) / 22.53,
    LIMIT_AGE == "21-30" ~ (BPA_CONC_POINTS - 87.08) / 21.50,
    LIMIT_AGE == "31-40" ~ (BPA_CONC_POINTS - 85.48) / 22.56,
    LIMIT_AGE == "41-50" ~ (BPA_CONC_POINTS - 80.72) / 22.85,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID, AGE,GROUP,EDU_LEVEL, LIMIT_AGE,BPA_CONC_POINTS, BPA_CONC_EscoreZ) %>% 
  arrange(ID)

BPA_CONC_EscoreZ


#BPA_DIVD

BPA_DIVID_EscoreZ <- data %>%
  mutate(BPA_DIVID_EscoreZ = case_when(
    LIMIT_AGE == "18-20" ~ (BPA_DIVID_POINTS - 79.42) / 23.49,
    LIMIT_AGE == "21-30" ~ (BPA_DIVID_POINTS - 77.19) / 24.42,
    LIMIT_AGE == "31-40" ~ (BPA_DIVID_POINTS - 71.28) / 25.33,
    LIMIT_AGE == "41-50" ~ (BPA_DIVID_POINTS - 61.22) / 26.53,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,BPA_DIVID_POINTS, BPA_DIVID_EscoreZ) %>% 
  arrange(ID)

BPA_DIVID_EscoreZ


#BPA_ALTERN

BPA_ALTERN_EscoreZ <- data %>%
  mutate(BPA_ALTERN_EscoreZ = case_when(
    LIMIT_AGE == "18-20" ~ (BPA_ALTERN_POINTS - 93.21) / 21.76,
    LIMIT_AGE == "21-30" ~ (BPA_ALTERN_POINTS - 87.53) / 23.56,
    LIMIT_AGE == "31-40" ~ (BPA_ALTERN_POINTS - 82.28) / 24.84,
    LIMIT_AGE == "41-50" ~ (BPA_ALTERN_POINTS - 72.70) / 25.80,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,BPA_ALTERN_POINTS, BPA_ALTERN_EscoreZ) %>% 
  arrange(ID)

BPA_ALTERN_EscoreZ 


#BPA_TOTAL

BPA_TOTAL_EscoreZ <- data %>%
  mutate(BPA_TOTAL_EscoreZ = case_when(
    LIMIT_AGE == "18-20" ~ (BPA_TOTAL - 258.42) / 56.59,
    LIMIT_AGE == "21-30" ~ (BPA_TOTAL - 251.79) / 58.61,
    LIMIT_AGE == "31-40" ~ (BPA_TOTAL - 239.04) / 62.77,
    LIMIT_AGE == "41-50" ~ (BPA_TOTAL - 214.65) / 64.33,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,BPA_TOTAL, BPA_TOTAL_EscoreZ) %>% 
  arrange(ID)

BPA_TOTAL_EscoreZ



BPAs_EscoreZ <- bind_cols(BPA_CONC_EscoreZ, BPA_DIVID_EscoreZ, BPA_ALTERN_EscoreZ, BPA_TOTAL_EscoreZ) %>% 
          na.omit()
New names:
• `ID` -> `ID...1`
• `ID` -> `ID...8`
• `ID` -> `ID...11`
• `ID` -> `ID...14`
write.xlsx(BPAs_EscoreZ, file = "BPAs_EscoreZ.xlsx")




################################## FDT Z-Score Calculating  #####################################


data <- readxl::read_xlsx ("DADOS_BRUTOS_COVID_LONGA_PREENCHENDO.xlsx")

data <- na.omit(data)

                # DETERMINANDO LIMITES A SEREM APLICADOS

limites_idade <- c(18, 19, 34, 50)

                # ADICIONANDO COLUNA AO DADO, RELACIONADO AOS LIMITES DESEJADOS

data <- data %>%
  mutate(LIMIT_AGE = cut(AGE, breaks = limites_idade, labels =
                           c("18", "19-34", "35-50"))) %>% 
  arrange(AGE)
  
data


#FDT READING

FDT_READING_TIME_Z <- data %>%
  mutate(FDT_READING_TIME_Z = case_when(
    LIMIT_AGE == "18" ~ (FDT_READING_TIME - 20.4) / 4.1,
    LIMIT_AGE == "19-34" ~ (FDT_READING_TIME - 22) / 5.6,
    LIMIT_AGE == "35-50" ~ (FDT_READING_TIME - 23.9) / 6.5,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,AGE, EDU_LEVEL,GROUP, LIMIT_AGE,FDT_READING_TIME,  FDT_READING_TIME_Z) %>% 
  arrange(ID)


FDT_READING_TIME_Z



#FDT COUTING

FDT_COUNTING_TIME_Z <- data %>%
  mutate(FDT_COUNTING_TIME_Z = case_when(
    LIMIT_AGE == "18" ~ (FDT_COUNTING_TIME - 23.8) / 3.5,
    LIMIT_AGE == "19-34" ~ (FDT_COUNTING_TIME - 24.2) / 5.2,
    LIMIT_AGE == "35-50" ~ (FDT_COUNTING_TIME - 27.1) / 7.2,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,FDT_COUNTING_TIME, FDT_COUNTING_TIME_Z) %>% 
  arrange(ID)


FDT_COUNTING_TIME_Z


#FDT CHOOSING

FDT_CHOOSING_TIME_Z <- data %>%
  mutate(FDT_CHOOSING_TIME_Z = case_when(
    LIMIT_AGE == "18" ~ (FDT_CHOOSING_TIME - 34) / 5.9,
    LIMIT_AGE == "19-34" ~ (FDT_CHOOSING_TIME - 36.9) / 10,
    LIMIT_AGE == "35-50" ~ (FDT_CHOOSING_TIME - 41.7) / 14.5,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,FDT_CHOOSING_TIME, FDT_CHOOSING_TIME_Z) %>% 
  arrange(ID)


FDT_CHOOSING_TIME_Z



#FDT CHANGING

FDT_CHANGING_TIME_Z <- data %>%
  mutate(FDT_CHANGING_TIME_Z = case_when(
    LIMIT_AGE == "18" ~ (FDT_CHANGING_TIME - 44.8) / 9.1,
    LIMIT_AGE == "19-34" ~ (FDT_CHANGING_TIME - 46) / 13,
    LIMIT_AGE == "35-50" ~ (FDT_CHANGING_TIME - 53.6) / 18.4,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,FDT_CHANGING_TIME, FDT_CHANGING_TIME_Z) %>% 
  arrange(ID)


FDT_CHANGING_TIME_Z




#FDT INHIBITION

FDT_INHIBITION_Z <- data %>%
  mutate(FDT_INHIBITION_Z = case_when(
    LIMIT_AGE == "18" ~ (FDT_INHIBITION - 13.6) / 4.9,
    LIMIT_AGE == "19-34" ~ (FDT_INHIBITION - 14.8) / 8.3,
    LIMIT_AGE == "35-50" ~ (FDT_INHIBITION - 17.8) / 12,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,FDT_INHIBITION, FDT_INHIBITION_Z) %>% 
  arrange(ID)


FDT_INHIBITION_Z




#FDT FLEXBILITY

FDT_FLEXIBILITY_Z <- data %>%
  mutate(FDT_FLEXIBILITY_Z = case_when(
    LIMIT_AGE == "18" ~ (FDT_FLEXIBILITY - 24.4) / 7.8,
    LIMIT_AGE == "19-34" ~ (FDT_FLEXIBILITY - 23.9) / 10.8,
    LIMIT_AGE == "35-50" ~ (FDT_FLEXIBILITY - 29.7) / 15.7,
    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,FDT_FLEXIBILITY, FDT_FLEXIBILITY_Z) %>% 
  arrange(ID)


FDT_FLEXIBILITY_Z



#BIND COLS E SALVAR

FDT_EscoreZ <- bind_cols(FDT_READING_TIME_Z,FDT_COUNTING_TIME_Z,FDT_CHOOSING_TIME_Z,
                         FDT_CHANGING_TIME_Z,FDT_INHIBITION_Z,FDT_FLEXIBILITY_Z)
New names:
• `ID` -> `ID...1`
• `ID` -> `ID...8`
• `ID` -> `ID...11`
• `ID` -> `ID...14`
• `ID` -> `ID...17`
• `ID` -> `ID...20`
write.xlsx(FDT_EscoreZ, file = "FDT_EscoreZ.xlsx")



################################## RAVLTS Z-Score Calculating #####################################

data <- readxl::read_xlsx ("DADOS_BRUTOS_COVID_LONGA_PREENCHENDO.xlsx")

data <- na.omit(data)



limites_idade <- c(18, 20, 30, 40, 50)


data <- data %>%
  mutate(LIMIT_AGE = 
           cut(AGE, breaks = limites_idade, labels = 
                 c("18-20", "21-30", "31-40", "41-50"))) %>% 
  arrange(AGE) 
  
data


#RAVLT A1

RAVLT_A1_Z <- data %>%
  mutate(RAVLT_A1_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_A1 - 6.8) / 1.7,
    LIMIT_AGE == "21-30" ~ (RAVLT_A1 - 6.5) / 1.7,
    LIMIT_AGE == "31-40" ~ (RAVLT_A1 - 6.1) / 1.6,
    LIMIT_AGE == "41-50" ~ (RAVLT_A1 - 6) / 1.6,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID, AGE,EDU_LEVEL,GROUP, LIMIT_AGE,RAVLT_A1,  RAVLT_A1_Z) %>% 
  arrange(ID)


RAVLT_A1_Z 




#RAVLT A2

RAVLT_A2_Z <- data %>%
  mutate(RAVLT_A2_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_A2 - 9.5) / 2.2,
    LIMIT_AGE == "21-30" ~ (RAVLT_A2 - 8.9) / 2.2,
    LIMIT_AGE == "31-40" ~ (RAVLT_A2 - 8.7) / 2,
    LIMIT_AGE == "41-50" ~ (RAVLT_A2 - 8.5) / 2,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_A2, RAVLT_A2_Z) %>% 
  arrange(ID)


RAVLT_A2_Z


#RAVLT A3

RAVLT_A3_Z <- data %>%
  mutate(RAVLT_A3_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_A3 - 11) / 2.2,
    LIMIT_AGE == "21-30" ~ (RAVLT_A3 - 10.4) / 2.4,
    LIMIT_AGE == "31-40" ~ (RAVLT_A3 - 10.3) / 2.1,
    LIMIT_AGE == "41-50" ~ (RAVLT_A3 - 9.8) / 2.5,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_A3, RAVLT_A3_Z) %>% 
  arrange(ID)


RAVLT_A3_Z



#RAVLT A4

RAVLT_A4_Z <- data %>%
  mutate(RAVLT_A4_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_A4 - 11.8) / 2.4,
    LIMIT_AGE == "21-30" ~ (RAVLT_A4 - 11.4) / 2.4,
    LIMIT_AGE == "31-40" ~ (RAVLT_A4 - 11.4) / 2.1,
    LIMIT_AGE == "41-50" ~ (RAVLT_A4 - 10.7) / 2.7,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_A4,RAVLT_A4_Z) %>% 
  arrange(ID)


RAVLT_A4_Z





#RAVLT A5

RAVLT_A5_Z <- data %>%
  mutate(RAVLT_A5_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_A5 - 12.2) / 2.4,
    LIMIT_AGE == "21-30" ~ (RAVLT_A5 - 12.2) / 2.2,
    LIMIT_AGE == "31-40" ~ (RAVLT_A5 - 12.2) / 2.2,
    LIMIT_AGE == "41-50" ~ (RAVLT_A5 - 11.7) / 2.6,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_A5, RAVLT_A5_Z) %>% 
  arrange(ID)


RAVLT_A5_Z




#RAVLT  B1

RAVLT_B1_Z <- data %>%
  mutate(RAVLT_B1_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_B1 - 6.3) / 1.8,
    LIMIT_AGE == "21-30" ~ (RAVLT_B1 - 5.7) / 1.8,
    LIMIT_AGE == "31-40" ~ (RAVLT_B1 - 5.3) / 1.6,
    LIMIT_AGE == "41-50" ~ (RAVLT_B1 - 4.9) / 1.6,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_B1, RAVLT_B1_Z) %>% 
  arrange(ID)


RAVLT_B1_Z



#RAVLT A6

RAVLT_A6_Z <- data %>%
  mutate(RAVLT_A6_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_A6 - 11.1) / 2.5,
    LIMIT_AGE == "21-30" ~ (RAVLT_A6 - 10.9) / 2.6,
    LIMIT_AGE == "31-40" ~ (RAVLT_A6 - 10.8) / 2.4,
    LIMIT_AGE == "41-50" ~ (RAVLT_A6 - 9.8) / 2.8,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_A6, RAVLT_A6_Z) %>% 
  arrange(ID)


RAVLT_A6_Z


#RAVLT A7

RAVLT_A7_Z <- data %>%
  mutate(RAVLT_A7_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_A7 - 11) / 2.7,
    LIMIT_AGE == "21-30" ~ (RAVLT_A7 - 10.7) / 2.7,
    LIMIT_AGE == "31-40" ~ (RAVLT_A7 - 10.3) / 2.4,
    LIMIT_AGE == "41-50" ~ (RAVLT_A7 - 9.6) / 2.8,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_A7,RAVLT_A7_Z) %>% 
  arrange(ID)


RAVLT_A7_Z



#RAVLT REC

RAVLT_REC_Z <- data %>%
  mutate(RAVLT_REC_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_REC - 10) / 5.7,
    LIMIT_AGE == "21-30" ~ (RAVLT_REC - 11.4) / 4.7,
    LIMIT_AGE == "31-40" ~ (RAVLT_REC - 11.1) / 4.7,
    LIMIT_AGE == "41-50" ~ (RAVLT_REC - 9.9) / 5.6,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_REC,RAVLT_REC_Z) %>% 
  arrange(ID)


RAVLT_REC_Z



#RAVLT_TOTALSCORE


RAVLT_TOTALSCORE_Z <- data %>%
  mutate(RAVLT_TOTALSCORE_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_TOTALSCORE - 51.4) / 8.7,
    LIMIT_AGE == "21-30" ~ (RAVLT_TOTALSCORE - 49.3) / 8.6,
    LIMIT_AGE == "31-40" ~ (RAVLT_TOTALSCORE - 48.6) / 8,
    LIMIT_AGE == "41-50" ~ (RAVLT_TOTALSCORE - 46.7) / 9.6,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_TOTALSCORE, RAVLT_TOTALSCORE_Z) %>% 
  arrange(ID)

RAVLT_TOTALSCORE_Z



#RAVLT_ALT

RAVLT_ALT_Z <- data %>%
  mutate(RAVLT_ALT_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_ALT - 17.3) / 7.3,
    LIMIT_AGE == "21-30" ~ (RAVLT_ALT - 16.8) / 6.5,
    LIMIT_AGE == "31-40" ~ (RAVLT_ALT - 17.9) / 7,
    LIMIT_AGE == "41-50" ~ (RAVLT_ALT - 16.5) / 7.3,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_ALT, RAVLT_ALT_Z) %>% 
  arrange(ID)




RAVLT_ALT_Z



#RAVLT_RETENTION

RAVLT_RETENTION_Z <- data %>%
  mutate(RAVLT_RETENTION_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_RETENTION - 1) / 0.2,
    LIMIT_AGE == "21-30" ~ (RAVLT_RETENTION - 1) / 0.27,
    LIMIT_AGE == "31-40" ~ (RAVLT_RETENTION - 0.97) / 0.19,
    LIMIT_AGE == "41-50" ~ (RAVLT_RETENTION - 1.01) / 0.34,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_RETENTION, RAVLT_RETENTION_Z) %>% 
  arrange(ID)


RAVLT_RETENTION_Z



#RAVLT_PROAT_INTERFERENCE

RAVLT_PROAT_INTERFERENCE_Z <- data %>%
  mutate(RAVLT_PROAT_INTERFERENCE_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_PROAT_INTERFERENCE - 0.96) / 0.33,
    LIMIT_AGE == "21-30" ~ (RAVLT_PROAT_INTERFERENCE - 0.92) / 0.37,
    LIMIT_AGE == "31-40" ~ (RAVLT_PROAT_INTERFERENCE - 0.91) / 0.33,
    LIMIT_AGE == "41-50" ~ (RAVLT_PROAT_INTERFERENCE - 0.86) / 0.31,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_PROAT_INTERFERENCE, RAVLT_PROAT_INTERFERENCE_Z) %>% 
  arrange(ID)


RAVLT_PROAT_INTERFERENCE_Z




#RAVLT_RETRO_INTERFERENCE

RAVLT_RETRO_INTERFERENCE_Z <- data %>%
  mutate(RAVLT_RETRO_INTERFERENCE_Z = case_when(
    LIMIT_AGE == "18-20" ~ (RAVLT_RETRO_INTERFERENCE - 0.96) / 0.68,
    LIMIT_AGE == "21-30" ~ (RAVLT_RETRO_INTERFERENCE - 0.89) / 0.17,
    LIMIT_AGE == "31-40" ~ (RAVLT_RETRO_INTERFERENCE - 0.94) / 0.74,
    LIMIT_AGE == "41-50" ~ (RAVLT_RETRO_INTERFERENCE - 0.84) / 0.18,

    TRUE ~ NA_real_  # Caso padrĂ£o para outras faixas etĂ¡rias
  )) %>%
  select(ID,RAVLT_RETRO_INTERFERENCE, RAVLT_RETRO_INTERFERENCE_Z) %>% 
  arrange(ID)


RAVLT_RETRO_INTERFERENCE_Z




#BIND COLS E SALVAR

RAVLTs_EscoreZ <- bind_cols(RAVLT_A1_Z, RAVLT_A2_Z, RAVLT_A3_Z, RAVLT_A4_Z, RAVLT_A5_Z,
                            RAVLT_B1_Z, RAVLT_A6_Z, RAVLT_A7_Z, RAVLT_REC_Z, RAVLT_TOTALSCORE_Z,
                           RAVLT_RETENTION_Z, RAVLT_PROAT_INTERFERENCE_Z, RAVLT_RETRO_INTERFERENCE_Z ) 
New names:
• `ID` -> `ID...1`
• `ID` -> `ID...8`
• `ID` -> `ID...11`
• `ID` -> `ID...14`
• `ID` -> `ID...17`
• `ID` -> `ID...20`
• `ID` -> `ID...23`
• `ID` -> `ID...26`
• `ID` -> `ID...29`
• `ID` -> `ID...32`
• `ID` -> `ID...35`
• `ID` -> `ID...38`
• `ID` -> `ID...41`
write.xlsx(RAVLTs_EscoreZ, file = "RAVLTs_EscoreZ.xlsx")
library(tibble)
library(readxl)
library(dplyr)
library(gtExtras)
Carregando pacotes exigidos: gt
library(ggplot2)
library(plotly)

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library(viridis)
Carregando pacotes exigidos: viridisLite
library(hrbrthemes)


#setwd("C:/Users/felip/Desktop/R/3_analise")

getwd()
[1] "C:/Users/felip/Desktop/R/4_analise_"
######################################  Bubble Plots BPAs Zscore  ###############################

data <- readxl::read_xlsx ("BPAs_EscoreZ.xlsx", sheet = 1)

summary(data)
    ID...1               AGE           GROUP            EDU_LEVEL          LIMIT_AGE         BPA_CONC_POINTS
 Length:129         Min.   :20.00   Length:129         Length:129         Length:129         Min.   : 44.0  
 Class :character   1st Qu.:26.00   Class :character   Class :character   Class :character   1st Qu.: 80.0  
 Mode  :character   Median :32.00   Mode  :character   Mode  :character   Mode  :character   Median : 92.0  
                    Mean   :32.94                                                            Mean   : 92.2  
                    3rd Qu.:39.00                                                            3rd Qu.:106.0  
                    Max.   :50.00                                                            Max.   :120.0  
 BPA_CONC_EscoreZ     ID...8          BPA_DIVID_POINTS BPA_DIVID_EscoreZ   ID...11          BPA_ALTERN_POINTS
 Min.   :-2.0037   Length:129         Min.   : 26.00   Min.   :-1.8505   Length:129         Min.   : 50.00   
 1st Qu.:-0.2828   Class :character   1st Qu.: 71.00   1st Qu.:-0.1295   Class :character   1st Qu.: 87.00   
 Median : 0.3186   Mode  :character   Median : 80.00   Median : 0.2789   Mode  :character   Median : 99.00   
 Mean   : 0.3149                      Mean   : 80.22   Mean   : 0.3289                      Mean   : 97.36   
 3rd Qu.: 0.9096                      3rd Qu.: 93.00   3rd Qu.: 0.8522                      3rd Qu.:110.00   
 Max.   : 1.7190                      Max.   :116.00   Max.   : 1.8387                      Max.   :120.00   
 BPA_ALTERN_EscoreZ   ID...14            BPA_TOTAL     BPA_TOTAL_EscoreZ  
 Min.   :-1.59295   Length:129         Min.   :163.0   Min.   :-1.514929  
 1st Qu.: 0.06924   Class :character   1st Qu.:243.0   1st Qu.: 0.003583  
 Median : 0.67311   Mode  :character   Median :271.0   Median : 0.525092  
 Mean   : 0.59148                      Mean   :269.8   Mean   : 0.484156  
 3rd Qu.: 1.20840                      3rd Qu.:297.0   3rd Qu.: 1.003027  
 Max.   : 1.83333                      Max.   :350.0   Max.   : 2.103995  
colnames(data)
 [1] "ID...1"             "AGE"                "GROUP"              "EDU_LEVEL"          "LIMIT_AGE"         
 [6] "BPA_CONC_POINTS"    "BPA_CONC_EscoreZ"   "ID...8"             "BPA_DIVID_POINTS"   "BPA_DIVID_EscoreZ" 
[11] "ID...11"            "BPA_ALTERN_POINTS"  "BPA_ALTERN_EscoreZ" "ID...14"            "BPA_TOTAL"         
[16] "BPA_TOTAL_EscoreZ" 
data <- data %>% rename(ID = ID...1) %>% select(-ID...8,-ID...11,-ID...14)
  
                                        # Filtrando dados BPAs

p1 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,EDU_LEVEL , AGE, BPA_CONC_POINTS , BPA_CONC_EscoreZ  )

p2 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,EDU_LEVEL, AGE, BPA_DIVID_POINTS , BPA_DIVID_EscoreZ  )

p3 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,EDU_LEVEL ,AGE, BPA_ALTERN_POINTS , BPA_ALTERN_EscoreZ )

ptotal <- data %>%  select(ID,EDU_LEVEL ,GROUP ,EDU_LEVEL ,AGE, BPA_ALTERN_POINTS , BPA_ALTERN_EscoreZ )

                                                #   P1  
  

coresBPA <- c("#1a2887", "#799de4")



p1 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", BPA_CONC_POINTS,
                      "\nZ-Score: ", BPA_CONC_EscoreZ, sep="")) %>%
  ggplot(aes(x = AGE, y = BPA_CONC_EscoreZ, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresBPA) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score Focused Attention", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 18, face = "bold"),
    plot.subtitle = element_text(size = 18,face = "bold"),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 15),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    
            # GrĂ¡fico interativo da bibliotexa ggplottly

pp1 <- ggplotly(p1, tooltip="text") %>%
  
  layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))
  

pp1

                                #   P2

p2 <- data %>%
  arrange(ID) %>%
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", BPA_DIVID_POINTS,
                      "\nZ-Score: ", BPA_DIVID_EscoreZ, sep="")) %>%
  ggplot(aes(x = AGE, y = BPA_DIVID_EscoreZ, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7, position = "jitter") +
  scale_fill_manual(values = coresBPA) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score Divid Attention", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 18, face = "bold"),
    plot.subtitle = element_text(size = 18,face = "bold"),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 15),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

                      # GrĂ¡fico interativo da bibliotexa ggplottly

pp2 <- ggplotly(p2, tooltip="text") %>%  
 
   layout(legend = list(x = 0, y = 1.01,
                    title = " ",
                    bgcolor = "#ecf0f1",
                    bordercolor = "white",
                    borderwidth = 1,
                    font = list(size = 9, family = "Arial", color = "black"),
                    orientation = 50,
                    tracegroupgap = 20,
                    traceorder = "normal"
                    ))
 
pp2 

                                      #   P3

p3 <- data %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", BPA_ALTERN_POINTS,
                      "\nZ-Score: ", BPA_ALTERN_EscoreZ, sep="")) %>%
  
  ggplot(aes(x = AGE, y = BPA_ALTERN_EscoreZ, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresBPA) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score Altern Attention", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 18, face = "bold"),
    plot.subtitle = element_text(size = 18,face = "bold"),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 15),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
  

                    # GrĂ¡fico interativo da bibliotexa ggplottly

pp3 <-  ggplotly(p3, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))


pp3

                              #BPA_TOTAL

ptotal <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", BPA_TOTAL,
                      "\nZ-Score: ", BPA_TOTAL_EscoreZ, sep="")) %>%
  ggplot(aes(x = AGE, y = BPA_TOTAL_EscoreZ, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresBPA) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score Total", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 18, face = "bold"),
    plot.subtitle = element_text(size = 18,face = "bold"),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 15),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    
            # GrĂ¡fico interativo da bibliotexa ggplottly

pptotal <- ggplotly(ptotal, tooltip="text") %>%
  
  layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))
  

pptotal

######################################  Bubble Plots FDTs Zscore  ###############################

data <- readxl::read_excel("FDT_EscoreZ.xlsx")

data <- na.omit(data)

colnames(data)
 [1] "ID...1"              "AGE"                 "EDU_LEVEL"           "GROUP"              
 [5] "LIMIT_AGE"           "FDT_READING_TIME"    "FDT_READING_TIME_Z"  "ID...8"             
 [9] "FDT_COUNTING_TIME"   "FDT_COUNTING_TIME_Z" "ID...11"             "FDT_CHOOSING_TIME"  
[13] "FDT_CHOOSING_TIME_Z" "ID...14"             "FDT_CHANGING_TIME"   "FDT_CHANGING_TIME_Z"
[17] "ID...17"             "FDT_INHIBITION"      "FDT_INHIBITION_Z"    "ID...20"            
[21] "FDT_FLEXIBILITY"     "FDT_FLEXIBILITY_Z"  
data <- data %>% rename(ID = ID...1)

data

                                      #  Filtrando FDTs 



p4 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, FDT_READING_TIME , FDT_READING_TIME_Z  )

p5 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, FDT_COUNTING_TIME , FDT_COUNTING_TIME_Z  )

p6 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, FDT_CHOOSING_TIME , FDT_CHOOSING_TIME_Z )

p7 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, FDT_CHANGING_TIME , FDT_CHANGING_TIME_Z )

p8 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, FDT_INHIBITION , FDT_INHIBITION_Z )

p9 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, FDT_FLEXIBILITY , FDT_FLEXIBILITY_Z )

                                            #  P4


coresFDT <- c("#f6a3ab", "#1ab6ac")



p4 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", FDT_READING_TIME,
                      "\nZ-Score: ", FDT_READING_TIME_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = FDT_READING_TIME_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresFDT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score FDT Reading Time", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp4 <- ggplotly(p4, tooltip="text") %>%
  
  layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))


pp4

                                      #  P5

p5 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", FDT_COUNTING_TIME,
                      "\nZ-Score: ", FDT_COUNTING_TIME_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = FDT_COUNTING_TIME_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresFDT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score FDT Counting Time", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp5 <- ggplotly(p5, tooltip="text") %>%
  
  layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))


pp5

                                      #  P6


p6 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", FDT_CHOOSING_TIME,
                      "\nZ-Score: ", FDT_CHOOSING_TIME_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = FDT_CHOOSING_TIME_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresFDT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score FDT Chossing Time", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp6 <- ggplotly(p6, tooltip="text") %>%
  
  layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))


pp6

                                      # P7


p7<- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", FDT_CHANGING_TIME,
                      "\nZ-Score: ", FDT_CHANGING_TIME_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = FDT_CHANGING_TIME_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresFDT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score FDT Changing Time", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp7 <- ggplotly(p7, tooltip="text") %>%
  
  layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))


pp7

                                      # P8


p8<- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", FDT_INHIBITION,
                      "\nZ-Score: ", FDT_INHIBITION_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = FDT_INHIBITION_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresFDT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score FDT Inbition", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )

pp8 <- ggplotly(p8, tooltip="text") %>%
  
  layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))


pp8

                                    #   P9

p9<- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", FDT_FLEXIBILITY,
                      "\nZ-Score: ", FDT_FLEXIBILITY_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = FDT_FLEXIBILITY_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresFDT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score FDT Flexibility", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp9 <- ggplotly(p9, tooltip="text") %>%
  
  layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))


pp9
######################################  Bubble Plots RAVLTs Zscore  ###############################


data <- readxl::read_xlsx ("RAVLTs_EscoreZ.xlsx")

data

data <- data %>% dplyr::rename(ID = ID...1)

                                        # Filtrando RAVLTs 



p10 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_A1 , RAVLT_A1_Z  )

p11 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_A2 , RAVLT_A2_Z  )

p12 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_A3 , RAVLT_A3_Z )

p13 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_A4 , RAVLT_A4_Z )

p14 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_A5 , RAVLT_A5_Z )

p15 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_B1 , RAVLT_B1_Z )

p16 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_A6 , RAVLT_A6_Z )

p17 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_A7 , RAVLT_A7_Z )

p18 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_TOTALSCORE , RAVLT_TOTALSCORE_Z )

p19 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_REC , RAVLT_REC_Z )

p20 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_RETENTION , RAVLT_RETENTION_Z )

p21 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_PROAT_INTERFERENCE , RAVLT_PROAT_INTERFERENCE_Z )

p22 <- data %>%  select(ID,EDU_LEVEL ,GROUP ,AGE, RAVLT_RETRO_INTERFERENCE , RAVLT_RETRO_INTERFERENCE_Z )

                                      # P10


coresRAVLT<- c("#7f1c2b", "#9c9ce9")



p10 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_A1,
                      "\nZ-Score: ", RAVLT_A1_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_A1_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT A1", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    


pp10 <- ggplotly(p10, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp10

                                    # P11


p11 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_A2,
                      "\nZ-Score: ", RAVLT_A2_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_A2_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT A2", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp11 <- ggplotly(p11, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp11

                            # P12


p12 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_A3,
                      "\nZ-Score: ", RAVLT_A3_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_A3_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT A3", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp12 <- ggplotly(p12, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp12

                                # P13


p13 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_A4,
                      "\nZ-Score: ", RAVLT_A4_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_A4_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT A4", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )


pp13 <- ggplotly(p13, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp13

                                  #  P14


p14 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_A5,
                      "\nZ-Score: ", RAVLT_A5_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_A5_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT A4", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp14 <- ggplotly(p14, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp14

                                # P15


p15 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_B1,
                      "\nZ-Score: ", RAVLT_B1_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_B1_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT B1", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp15 <- ggplotly(p15, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp15

                              #  P16


p16 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_A6,
                      "\nZ-Score: ", RAVLT_A6_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_A6_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT A6", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp16 <- ggplotly(p16, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))


pp16

                                  #  P17

p17 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_A7,
                      "\nZ-Score: ", RAVLT_A7_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_A7_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT A7", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp17 <- ggplotly(p17, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp17

                                      # P18

p18 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_TOTALSCORE,
                      "\nZ-Score: ", RAVLT_TOTALSCORE_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_TOTALSCORE_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT Total Score", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp18 <- ggplotly(p18, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp18

                                    # P19

p19 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_TOTALSCORE,
                      "\nZ-Score: ", RAVLT_TOTALSCORE_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_TOTALSCORE_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT Total Score", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp19 <- ggplotly(p19, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp19

                                  # P20

p20 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_RETENTION,
                      "\nZ-Score: ", RAVLT_RETENTION_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_RETENTION_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT Retention", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    


pp20 <- ggplotly(p20, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))


pp20

                                    # P21

p21 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_PROAT_INTERFERENCE,
                      "\nZ-Score: ", RAVLT_PROAT_INTERFERENCE_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_PROAT_INTERFERENCE_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT Proative Interference", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp21 <- ggplotly(p21, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp21

                                      #  P22

p22 <- data %>% 
  arrange(ID) %>% 
  mutate(text = paste("Identification: ", ID , "\nAge: ", AGE , 
                      "\nPoints: ", RAVLT_RETRO_INTERFERENCE,
                      "\nZ-Score: ", RAVLT_RETRO_INTERFERENCE_Z, sep="")) %>%
  ggplot(aes(x = AGE, y = RAVLT_RETRO_INTERFERENCE_Z, fill= GROUP, stroke = 0,
             size = AGE, shape = EDU_LEVEL , text = text)) +
  geom_point(alpha = 0.7,position = "jitter") +
  scale_fill_manual(values = coresRAVLT) +
  scale_size(range = c(2, 5)) +
  scale_x_continuous(name = "Age", limits = c(10, 52), breaks = seq(10, 50, by = 10)) +
  scale_y_continuous(name = "Z Score", limits = c(-3, 3), breaks = seq(-3, 3)) +
  geom_hline(yintercept = -3:3, color = "black", alpha = 0.1) + 
  geom_hline(yintercept = 0, color = "red", alpha = 0.3, linetype = "") +
  labs(y = "Y", title = "Z Score RAVLT Retroative Interference", shape= "", size = "") +
  theme_classic() +
  
    theme(
      text = element_text(family = "Arial Narrow", size = 11.5),
    plot.title = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 12),
    strip.text = element_text(size = 12),
    plot.caption = element_text(size = 9, face = "italic"),
    axis.title = element_text(size = 10),
    legend.position = "",
    legend.text = element_text(size = 5)
    )
    

pp22 <- ggplotly(p22, tooltip="text") %>%  
  
    layout(legend = list(x = 0, y = 1.01,
                     title = " ",
                     bgcolor = "#ecf0f1",
                     bordercolor = "white",
                     borderwidth = 1,
                     font = list(size = 9, family = "Arial", color = "black"),
                     orientation = 50,
                     tracegroupgap = 20,
                     traceorder = "normal"
                     ))

pp22
NA
NA

#install.packages('reshape2')
library(ggplot2)
library(dplyr)
library(readxl)
library(reshape2)

getwd()
[1] "C:/Users/felip/Desktop/R/4_analise_"
df <- read_excel("RAVLTs_EscoreZ.xlsx")

colnames(df)
 [1] "ID...1"                     "AGE"                        "EDU_LEVEL"                  "GROUP"                     
 [5] "LIMIT_AGE"                  "RAVLT_A1"                   "RAVLT_A1_Z"                 "ID...8"                    
 [9] "RAVLT_A2"                   "RAVLT_A2_Z"                 "ID...11"                    "RAVLT_A3"                  
[13] "RAVLT_A3_Z"                 "ID...14"                    "RAVLT_A4"                   "RAVLT_A4_Z"                
[17] "ID...17"                    "RAVLT_A5"                   "RAVLT_A5_Z"                 "ID...20"                   
[21] "RAVLT_B1"                   "RAVLT_B1_Z"                 "ID...23"                    "RAVLT_A6"                  
[25] "RAVLT_A6_Z"                 "ID...26"                    "RAVLT_A7"                   "RAVLT_A7_Z"                
[29] "ID...29"                    "RAVLT_REC"                  "RAVLT_REC_Z"                "ID...32"                   
[33] "RAVLT_TOTALSCORE"           "RAVLT_TOTALSCORE_Z"         "ID...35"                    "RAVLT_RETENTION"           
[37] "RAVLT_RETENTION_Z"          "ID...38"                    "RAVLT_PROAT_INTERFERENCE"   "RAVLT_PROAT_INTERFERENCE_Z"
[41] "ID...41"                    "RAVLT_RETRO_INTERFERENCE"   "RAVLT_RETRO_INTERFERENCE_Z"
#1a2887, #799de4

######################################  Curva de Crescimento  ##########################################

df.RAVLTs <- df %>% select(GROUP,AGE,RAVLT_A1,RAVLT_A2,RAVLT_A3,RAVLT_A4,RAVLT_A5)


df.melted <- melt(df.RAVLTs, id.vars = c("AGE", "GROUP"), variable.name = "VariĂ¡vel", value.name = "PontuaĂ§Ă£o")

cores <- c("CASE" = "#1a2887", "CONTROL" = "#799de4")

# Criar o grĂ¡fico de linhas
p <- ggplot(df.melted, aes(x = AGE, y = PontuaĂ§Ă£o, color = GROUP)) +
  geom_point(alpha=0.5, position = "jitter", size = 1.5) +
  stat_smooth( method = "lm", span = 0.8, se = F)+
  labs(title = "GrĂ¡fico de Linhas RAVLT por Grupo",
       x = "AGE",
       y = "PontuaĂ§Ă£o RAVLT",
       color = "Grupos") +
  scale_color_manual(values = cores) +
  facet_wrap(~ VariĂ¡vel, scales = "free_y", nrow = 1) +  # SeparaĂ§Ă£o por GROUP (caso e controle)
  theme_minimal()

p
`geom_smooth()` using formula = 'y ~ x'

shapiro.test(df.RAVLTs$RAVLT_A5)

    Shapiro-Wilk normality test

data:  df.RAVLTs$RAVLT_A5
W = 0.95843, p-value = 0.0005649

LS0tDQp0aXRsZTogIkFuw6FsaXNlIENvbXBsZXRhIGRvcyBEYWRvcyBOZXVyb2NvZ25pdGl2b3MiDQphdXRob3I6ICJSb2RvbHBobyBDb3J0ZXosIEZlbGlwZSBGYWd1bmRlcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KZGF0ZTogIjIwMjQtMDUtMDYiDQotLS0NCg0KYGBge3IgQm94LXBsb3RzIH0NCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBtZXNzYWdlPUZBTFNFLCANCiAgd2FybmluZz1GQUxTRSwNCiAgZmlnLmNhcD0gIkJveCBQbG90cyBUZXN0LVQiKQ0KDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJnZ3RleHQiKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3B1YnIpDQpsaWJyYXJ5KGdndGV4dCkNCg0KDQpnZXR3ZCgpDQoNCmxpc3QuZmlsZXMoKQ0KDQpkYXRhIDwtIHJlYWR4bDo6cmVhZF9leGNlbCgiREFET1NfQlJVVE9TX0NPVklEX0xPTkdBX1BSRUVOQ0hFTkRPLnhsc3giKQ0KDQpkYXRhIDwtIG5hLm9taXQoZGF0YSkNCg0KZGF0YQ0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgVGVzdC5UIEJQQXMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnAxIDwtIGRhdGEgJT4lICBzZWxlY3QoR1JPVVAgLCBCUEFfQ09OQ19QT0lOVFMsQlBBX0RJVklEX1BPSU5UUywgQlBBX0FMVEVSTl9QT0lOVFMgKQ0KDQoNCiAgICAgIyBSZW9yZ2FuaXphciBvcyBkYWRvcyBwYXJhIG8gZm9ybWF0byAnbG9uZycgdXNhbmRvIGEgZnVuw6fDo28gcGl2b3RfbG9uZ2VyKCkgZG8gcGFjb3RlIHRpZHlyDQoNCnAxX2xvbmcgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihwMSwgY29scyA9IC1HUk9VUCwgbmFtZXNfdG8gPSAiVmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAiVmFsdWUiKQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNHcsOhZmljbyBmYWNldGFkbyBCUEEtQ29uYyxEaXZpZCxBbHRlcm4uDQoNCnBsb3QxIDwtIGdncGxvdChwMV9sb25nLCBhZXMoeCA9IEdST1VQLCB5ID0gVmFsdWUsIGZpbGwgPSBHUk9VUCkpICsgDQogICAgICAgIA0KICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCBhbHBoYSA9IDAuNSwgd2lkdGggPSAwLjcsIGNvZWYgPSAwLCBsd2QgPSAwLjQsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX2ppdHRlcihhZXMoY29sb3IgPSBHUk9VUCksIHNpemUgPSAyLjUsIHdpZHRoID0gMC4xNSwgYWxwaGEgPSAwLjUpICsNCiAgDQogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArIA0KICANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsgIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsNCiAgDQogIGZhY2V0X3dyYXAofiBWYXJpYWJsZSwgc2NhbGVzID0gImZyZWVfeSIsIA0KICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoVmFyaWFibGUgPSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhCUEFfQ09OQ19QT0lOVFMgPSAiQ29uYyBQb2ludHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQQV9ESVZJRF9QT0lOVFMgPSAiRGl2aWQgUG9pbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUEFfQUxURVJOX1BPSU5UUyA9ICJBbHRlcm4gUG9pbnRzIikpKSArDQogIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygyMCwgMTMwKSwgYnJlYWtzID0gc2VxKDIwLCAxMjAsIGJ5ID0gMjApKSArDQogIA0KICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgIGZhY2UgPSAiYm9sZCIpKQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBUZXN0LVQNCg0KcGxvdDEgPC0gcGxvdDEgKyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gInQudGVzdCIsIGxhYmVsLnggPSAxLjM4KQ0KDQpwbG90MQ0KDQpnZ3NhdmUoImJ4cGxvdF9CUEFzLnBkZiIsIHBsb3QgPSBwbG90MSwgd2lkdGggPSAxMywgaGVpZ2h0ID0gMTApDQoNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjQlBBIFRvdGFsDQoNCnB0b3RhbCA8LSBkYXRhICU+JSAgc2VsZWN0KEdST1VQICxCUEFfVE9UQUwpDQoNCiMgUmVvcmdhbml6YXIgb3MgZGFkb3MgcGFyYSBvIGZvcm1hdG8gJ2xvbmcnIHVzYW5kbyBhIGZ1bsOnw6NvIHBpdm90X2xvbmdlcigpIGRvIHBhY290ZSB0aWR5cg0KDQojcF9icGE8LSB0aWR5cjo6cGl2b3RfbG9uZ2VyKHB0b3RhbCwgY29scyA9IC1HUk9VUCwgbmFtZXNfdG8gPSAiVmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAiVmFsdWUiKQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KcGxvdG90YWwgPC0gZ2dwbG90KHB0b3RhbCwgYWVzKHggPSBHUk9VUCwgeSA9IEJQQV9UT1RBTCwgZmlsbCA9IEdST1VQKSkgKyANCiAgDQogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIGFscGhhID0gMC41LCB3aWR0aCA9IDAuNywgY29lZiA9IDAsIGx3ZCA9IDAuNCwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21faml0dGVyKGFlcyhjb2xvciA9IEdST1VQKSwgc2l6ZSA9IDIuNSwgd2lkdGggPSAwLjE1LCBhbHBoYSA9IDAuNSkgKw0KICANCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwpICsgDQogIGdndGl0bGUoIlRvdGFsIFNjb3JlIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMWEyODg3IiwgIiM3OTlkZTQiKSkgKyAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMWEyODg3IiwgIiM3OTlkZTQiKSkgKw0KICANCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMTAwLCA0MDApLCBicmVha3MgPSBzZXEoMTAwLCA0MDAsIGJ5ID0gNTApKSArDQogIA0KICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwLCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIiksDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCwgIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgIGZhY2UgPSAiYm9sZCIpKQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBUZXN0LVQNCg0KcGxvdG90YWwgPC0gcGxvdG90YWwgKyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gInQudGVzdCIsIGxhYmVsLnggPSAxLjM4KQ0KDQpwbG90b3RhbA0KDQojZ2dzYXZlKCJieHBsb3RfQlBBc1RPVEFMLnBkZiIsIHBsb3QgPSBwbG90b3RhbCwgd2lkdGggPSAxMywgaGVpZ2h0ID0gMTApDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIFRlc3QuVCBGRFRzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoNCmRhdGEgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJEQURPU19CUlVUT1NfQ09WSURfTE9OR0FfUFJFRU5DSEVORE8ueGxzeCIpDQoNCmRhdGEgPC0gbmEub21pdChkYXRhKQ0KDQpkYXRhDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0ZpbHRyYW5kbyBGRFRzDQoNCnAyIDwtIGRhdGEgJT4lICBzZWxlY3QoR1JPVVAgLCBGRFRfUkVBRElOR19USU1FICxGRFRfQ09VTlRJTkdfVElNRSwgRkRUX0NIT09TSU5HX1RJTUUsIEZEVF9DSEFOR0lOR19USU1FLA0KICAgICAgICAgICAgICAgICAgICAgICBGRFRfSU5ISUJJVElPTiwgRkRUX0ZMRVhJQklMSVRZICkNCg0KDQogICAgICMgUmVvcmdhbml6YXIgb3MgZGFkb3MgcGFyYSBvIGZvcm1hdG8gJ2xvbmcnIHVzYW5kbyBhIGZ1bsOnw6NvIHBpdm90X2xvbmdlcigpIGRvIHBhY290ZSB0aWR5cg0KDQpwMl9sb25nIDwtIHRpZHlyOjpwaXZvdF9sb25nZXIocDIsIGNvbHMgPSAtR1JPVVAsIG5hbWVzX3RvID0gIlZhcmlhYmxlIiwgdmFsdWVzX3RvID0gIlZhbHVlIikNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFAyDQoNCnBsb3QyIDwtIGdncGxvdChwMl9sb25nLCBhZXMoeCA9IEdST1VQLCB5ID0gVmFsdWUsIGZpbGwgPSBHUk9VUCkpICsgDQogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIGFscGhhID0gMC41LCB3aWR0aCA9IDAuNywgY29lZiA9IDAsIGx3ZCA9IDAuNCwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21faml0dGVyKGFlcyhjb2xvciA9IEdST1VQKSwgc2l6ZSA9IDEuNSwgd2lkdGggPSAwLjE1LCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsgIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsNCiAgZmFjZXRfd3JhcCh+IFZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IiwgDQogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihWYXJpYWJsZSA9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKEZEVF9SRUFESU5HX1RJTUUgPSAiUmVhZGluZyBUaW1lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRFRfQ09VTlRJTkdfVElNRSA9ICJDb3VudGluZyBUaW1lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRFRfQ0hPT1NJTkdfVElNRSA9ICJDaG9vc2luZyBUaW1lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRFRfQ0hBTkdJTkdfVElNRSA9ICJDaGFnaW5nIFRpbWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZEVF9JTkhJQklUSU9OID0gICJJbmhpYml0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRUX0ZMRVhJQklMSVRZID0gIkZsZXhpYmlsaXR5IikpKSArDQogICNzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygyMCwgMTMwKSwgYnJlYWtzID0gc2VxKDIwLCAxMDAsIGJ5ID0gMjApKSArDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE5LCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEuNSwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIikpDQoNCg0KIyBBanVzdGUgYXMgZXNjYWxhcyBkZSBhY29yZG8gY29tIG8gbcOtbmltbyBlIG3DoXhpbW8gZG9zIGRhZG9zDQojcGxvdDEgPC0gcGxvdDEgKyB5bGltKG1pbihwMV9sb25nJFZhbHVlKSwgbWF4KHAxX2xvbmckVmFsdWUpKQ0KDQpwbG90MiA8LSBwbG90MiArIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAidC50ZXN0IiApDQogDQpwbG90Mg0KDQpnZ3NhdmUoZmlsZW5hbWUgPSAiRkRUc192YWx1ZXMucGRmIiwgcGxvdCA9IHBsb3QyKQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAgVGVzdC5UIFJBVkxUcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQoNCmRhdGEgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCJEQURPU19CUlVUT1NfQ09WSURfTE9OR0FfUFJFRU5DSEVORE8ueGxzeCIpDQoNCmRhdGEgPC0gbmEub21pdChkYXRhKQ0KDQpkYXRhDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0ZpbHRyYW5kbyBSQVZMVHMNCg0KDQpwMyA8LSBkYXRhICU+JSAgc2VsZWN0KEdST1VQICwgUkFWTFRfQTEgLFJBVkxUX0EyLCBSQVZMVF9BMywgUkFWTFRfQTQgICApDQoNCnA0IDwtIGRhdGEgJT4lICBzZWxlY3QoR1JPVVAgLCBSQVZMVF9BNSwgUkFWTFRfQTYsIFJBVkxUX0E3KQ0KDQpwNSA8LSBkYXRhICU+JSAgc2VsZWN0KEdST1VQICwgUkFWTFRfVE9UQUxTQ09SRSkNCg0KcDYgPC0gZGF0YSAlPiUgIHNlbGVjdChHUk9VUCxSQVZMVF9CMSxSQVZMVF9SRUMsUkFWTFRfUkVURU5USU9OKQ0KDQpwNyA8LSBkYXRhICU+JSAgc2VsZWN0KEdST1VQLFJBVkxUX1JFVEVOVElPTixSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0UpDQoNCg0KDQogICAgICMgUmVvcmdhbml6YXIgb3MgZGFkb3MgcGFyYSBvIGZvcm1hdG8gJ2xvbmcnIHVzYW5kbyBhIGZ1bsOnw6NvIHBpdm90X2xvbmdlcigpIGRvIHBhY290ZSB0aWR5cg0KDQpwM19sb25nIDwtIHRpZHlyOjpwaXZvdF9sb25nZXIocDMsIGNvbHMgPSAtR1JPVVAsIG5hbWVzX3RvID0gIlZhcmlhYmxlIiwgdmFsdWVzX3RvID0gIlZhbHVlIikNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFAzDQoNCnBsb3QzIDwtIGdncGxvdChwM19sb25nLCBhZXMoeCA9IEdST1VQLCB5ID0gVmFsdWUsIGZpbGwgPSBHUk9VUCkpICsgDQogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIGFscGhhID0gMC41LCB3aWR0aCA9IDAuNywgY29lZiA9IDAsIGx3ZCA9IDAuNCwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21faml0dGVyKGFlcyhjb2xvciA9IEdST1VQKSwgc2l6ZSA9IDEuNSwgd2lkdGggPSAwLjE1LCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsgIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsNCiAgZmFjZXRfd3JhcCh+IFZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IiwgDQogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihWYXJpYWJsZSA9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKFJBVkxUX0ExID0gIlJBVkxUX0ExIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVZMVF9BMiA9ICIgUkFWTFRfQTIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVkxUX0EzID0gIlJBVkxUX0EzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVZMVF9BNCA9ICJSQVZMVF9BNCIpKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAyMCkpICsNCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwpLA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpKQ0KDQoNCg0KcGxvdDMgPC0gcGxvdDMgKyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gInQudGVzdCIgLCBsYWJlbC55ID0gMTgsIGxhYmVsLnggPSAxLjEpDQoNCnBsb3QzDQoNCiNnZ3NhdmUoZmlsZW5hbWUgPSAiUkFWTFRfdmFsdWVzLnBkZiIsIHBsb3QgPSBwbG90MykNCg0KDQoNCiAgICAgIyBSZW9yZ2FuaXphciBvcyBkYWRvcyBwYXJhIG8gZm9ybWF0byAnbG9uZycgdXNhbmRvIGEgZnVuw6fDo28gcGl2b3RfbG9uZ2VyKCkgZG8gcGFjb3RlIHRpZHlyDQoNCnA0X2xvbmcgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihwNCwgY29scyA9IC1HUk9VUCwgbmFtZXNfdG8gPSAiVmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAiVmFsdWUiKQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUDQNCg0KcGxvdDQgPC0gZ2dwbG90KHA0X2xvbmcsIGFlcyh4ID0gR1JPVVAsIHkgPSBWYWx1ZSwgZmlsbCA9IEdST1VQKSkgKyANCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSwgYWxwaGEgPSAwLjUsIHdpZHRoID0gMC43LCBjb2VmID0gMCwgbHdkID0gMC40LCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9qaXR0ZXIoYWVzKGNvbG9yID0gR1JPVVApLCBzaXplID0gMS41LCB3aWR0aCA9IDAuMTUsIGFscGhhID0gMC41KSArDQogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMWEyODg3IiwgIiM3OTlkZTQiKSkgKyAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCIjMWEyODg3IiwgIiM3OTlkZTQiKSkgKw0KICBmYWNldF93cmFwKH4gVmFyaWFibGUsIHNjYWxlcyA9ICJmcmVlX3kiLCANCiAgICAgICAgICAgICBsYWJlbGxlciA9IGxhYmVsbGVyKFZhcmlhYmxlID0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoUkFWTFRfQTUgPSAiUkFWTFRfQTUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVkxUX0E2ID0gIiBSQVZMVF9BNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFWTFRfQTcgPSAiUkFWTFRfQTciKSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMjApKSArDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSkNCg0KDQojIEFqdXN0ZSBhcyBlc2NhbGFzIGRlIGFjb3JkbyBjb20gbyBtw61uaW1vIGUgbcOheGltbyBkb3MgZGFkb3MNCiNwbG90MSA8LSBwbG90MSArIHlsaW0obWluKHAxX2xvbmckVmFsdWUpLCBtYXgocDFfbG9uZyRWYWx1ZSkpDQoNCnBsb3Q0IDwtIHBsb3Q0ICsgc3RhdF9jb21wYXJlX21lYW5zKG1ldGhvZCA9ICJ0LnRlc3QiICwgbGFiZWwueSA9IDE4LCBsYWJlbC54ID0gMS4xKQ0KDQpwbG90NA0KDQojZ2dzYXZlKGZpbGVuYW1lID0gIlJBVkxUX0E1X0E3LnBkZiIsIHBsb3QgPSBwbG90NCkNCg0KDQoNCiAgICAgIyBSZW9yZ2FuaXphciBvcyBkYWRvcyBwYXJhIG8gZm9ybWF0byAnbG9uZycgdXNhbmRvIGEgZnVuw6fDo28gcGl2b3RfbG9uZ2VyKCkgZG8gcGFjb3RlIHRpZHlyDQoNCnA1X2xvbmcgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihwNSwgY29scyA9IC1HUk9VUCwgbmFtZXNfdG8gPSAiVmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAiVmFsdWUiKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFA1DQoNCnBsb3Q1IDwtIGdncGxvdChwNV9sb25nLCBhZXMoeCA9IEdST1VQLCB5ID0gVmFsdWUsIGZpbGwgPSBHUk9VUCkpICsgDQogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIGFscGhhID0gMC41LCB3aWR0aCA9IDAuNywgY29lZiA9IDAsIGx3ZCA9IDAuNCwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21faml0dGVyKGFlcyhjb2xvciA9IEdST1VQKSwgc2l6ZSA9IDEuNSwgd2lkdGggPSAwLjE1LCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsgIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsNCiAgZmFjZXRfd3JhcCh+IFZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IiwgDQogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihWYXJpYWJsZSA9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKFJBVkxUX1RPVEFMU0NPUkUgPSAiUkFWTFRfVE9UQUxTQ09SRSIpKSkgKw0KICAjc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMjApKSArDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsICksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFjZSA9ICJib2xkIikpDQoNCg0KIyBBanVzdGUgYXMgZXNjYWxhcyBkZSBhY29yZG8gY29tIG8gbcOtbmltbyBlIG3DoXhpbW8gZG9zIGRhZG9zDQojcGxvdDEgPC0gcGxvdDEgKyB5bGltKG1pbihwMV9sb25nJFZhbHVlKSwgbWF4KHAxX2xvbmckVmFsdWUpKQ0KDQpwbG90NSA8LSBwbG90NSArIHN0YXRfY29tcGFyZV9tZWFucyhtZXRob2QgPSAidC50ZXN0IiAsICBsYWJlbC55ID0gNjUsIGxhYmVsLnggPTEuNykNCg0KcGxvdDUNCg0KI2dnc2F2ZShmaWxlbmFtZSA9ICJSQVZMVF90b3RhbC5wZGYiLCBwbG90ID0gcGxvdDUpDQoNCg0KDQoNCiAgICAgIyBSZW9yZ2FuaXphciBvcyBkYWRvcyBwYXJhIG8gZm9ybWF0byAnbG9uZycgdXNhbmRvIGEgZnVuw6fDo28gcGl2b3RfbG9uZ2VyKCkgZG8gcGFjb3RlIHRpZHlyDQoNCnA2X2xvbmcgPC0gdGlkeXI6OnBpdm90X2xvbmdlcihwNiwgY29scyA9IC1HUk9VUCwgbmFtZXNfdG8gPSAiVmFyaWFibGUiLCB2YWx1ZXNfdG8gPSAiVmFsdWUiKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFA2DQoNCnBsb3Q2IDwtIGdncGxvdChwNl9sb25nLCBhZXMoeCA9IEdST1VQLCB5ID0gVmFsdWUsIGZpbGwgPSBHUk9VUCkpICsgDQogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIGFscGhhID0gMC41LCB3aWR0aCA9IDAuNywgY29lZiA9IDAsIGx3ZCA9IDAuNCwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21faml0dGVyKGFlcyhjb2xvciA9IEdST1VQKSwgc2l6ZSA9IDEuNSwgd2lkdGggPSAwLjE1LCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsgIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsNCiAgZmFjZXRfd3JhcCh+IFZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IiwgDQogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihWYXJpYWJsZSA9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKFJBVkxUX0IxID0gIlJBVkxUX0IxIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQVZMVF9SRUMgPSAiIFJBVkxUX1JFQyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSkgKw0KICAjc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMjApKSArDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1LCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiVGFob21hIiwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiVGFob21hIiksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNCwgZmFtaWx5ID0gIlRhaG9tYSIsIGZhY2UgPSAiYm9sZCIpKQ0KDQoNCiMgQWp1c3RlIGFzIGVzY2FsYXMgZGUgYWNvcmRvIGNvbSBvIG3DrW5pbW8gZSBtw6F4aW1vIGRvcyBkYWRvcw0KI3Bsb3QxIDwtIHBsb3QxICsgeWxpbShtaW4ocDFfbG9uZyRWYWx1ZSksIG1heChwMV9sb25nJFZhbHVlKSkNCg0KcGxvdDYgKyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gInQudGVzdCIsIGxhYmVsLnkgPSAxNSwgbGFiZWwueCA9IDEuMSkNCg0KcGxvdDYNCg0KDQogICAgICMgUmVvcmdhbml6YXIgb3MgZGFkb3MgcGFyYSBvIGZvcm1hdG8gJ2xvbmcnIHVzYW5kbyBhIGZ1bsOnw6NvIHBpdm90X2xvbmdlcigpIGRvIHBhY290ZSB0aWR5cg0KDQpwN19sb25nIDwtIHRpZHlyOjpwaXZvdF9sb25nZXIocDcsIGNvbHMgPSAtR1JPVVAsIG5hbWVzX3RvID0gIlZhcmlhYmxlIiwgdmFsdWVzX3RvID0gIlZhbHVlIikNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFA3DQoNCnBsb3Q3IDwtIGdncGxvdChwN19sb25nLCBhZXMoeCA9IEdST1VQLCB5ID0gVmFsdWUsIGZpbGwgPSBHUk9VUCkpICsgDQogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIGFscGhhID0gMC41LCB3aWR0aCA9IDAuNywgY29lZiA9IDAsIGx3ZCA9IDAuNCwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21faml0dGVyKGFlcyhjb2xvciA9IEdST1VQKSwgc2l6ZSA9IDEuNSwgd2lkdGggPSAwLjE1LCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsgIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiIzFhMjg4NyIsICIjNzk5ZGU0IikpICsNCiAgZmFjZXRfd3JhcCh+IFZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IiwgDQogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihWYXJpYWJsZSA9IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVkxUX1JFVEVOVElPTiA9ICJSQVZMVF9SRVRFTlRJT04iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVkxUX1JFVFJPX0lOVEVSRkVSRU5DRSA9ICJSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0UiKSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMikpICsNCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpLA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTQsIGZhbWlseSA9ICJUYWhvbWEiLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhbWlseSA9ICJUYWhvbWEiKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0LCBmYW1pbHkgPSAiVGFob21hIiwgZmFjZSA9ICJib2xkIikpDQoNCg0KcGxvdDcgKyBzdGF0X2NvbXBhcmVfbWVhbnMobWV0aG9kID0gInQudGVzdCIgKQ0KDQpwbG90Nw0KDQpgYGANCg0KYGBge3IgQ2FsY3VsYXRpbmd9DQoNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShndEV4dHJhcykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShocmJydGhlbWVzKQ0KbGlicmFyeShvcGVueGxzeCkNCg0KDQojZGF0YSA8LSByZWFkeGw6OnJlYWRfeGxzeCAoIkJQQXNfRkRUc18gUkFWTFRzX0VzY29yZVoueGxzeCIsIHNoZWV0ID0gMSkNCg0KDQojaW5zdGFsbC5wYWNrYWdlcygidGliYmxlIikNCiNpbnN0YWxsLnBhY2thZ2VzKCJvcGVueGxzeCIpDQoNCg0KDQoNCiNzZXR3ZCgiQzovVXNlcnMvVXNlci9EZXNrdG9wL0FuYWx5c2lzIGluIFIvTmV1cm9Db3ZpZCIpDQoNCmdldHdkKCkNCg0KDQpkYXRhIDwtIHJlYWR4bDo6cmVhZF94bHN4ICgiREFET1NfQlJVVE9TX0NPVklEX0xPTkdBX1BSRUVOQ0hFTkRPLnhsc3giKQ0KDQpkYXRhIDwtIG5hLm9taXQoZGF0YSkNCg0KIA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCUEEgWi1TY29yZSAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxwrogVHJ5DQogICAgICAgICAgICAgICAgICAjIFRFTlRBVElWQSBERSBDUklBw4fDg08gREUgRlVOw4fDg08NCg0KY2JpbmQoZGF0YSkNCg0KY2FsY3VsYXJfel9zY29yZSA8LSBmdW5jdGlvbih4LCBtZWRpYSwgZGVzdmlvX3BhZHJhbykgew0KICBpZiAoeCA+PSAyMSAmIHggPD0gMzApIHsNCiAgICB6X3Njb3JlIDwtICh4IC0gbWVkaWEpIC8gZGVzdmlvX3BhZHJhbw0KICAgIHJldHVybih6X3Njb3JlKQ0KICB9DQp9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDLCuiBUcnkNCg0KIyBEZWZpbmlyIG9zIHZhbG9yZXMgY29uc3RhbnRlcyBkZSBtw6lkaWEgZSBkZXN2aW8gcGFkcsOjbyBwYXJhIGNhZGEgZmFpeGEgZXTDoXJpYQ0KY29uc3RhbnRlcyA8LSB0cmliYmxlKA0KICB+TElNSVRfQUdFLCB+bWVkaWFfY29uc3RhbnRlLCB+ZGVzdmlvX3BhZHJhb19jb25zdGFudGUsDQogICIxOC0yMCIsIDg1Ljc5LCAyMi41MywNCiAgIjIxLTMwIiwgODcuMDgsIDIxLjUwLA0KICAiMzEtNDAiLCA4NS40OCwgMjIuNTYsDQogICI0MS00OSIsIDgwLjcyLCAyMi44NQ0KKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgM8K6IFRyeQ0KICAjIENPTUXDh0FSIERBUVVJIC0tLS0tPiAgREVURVJNSU5BTkRPIExJTUlURVMgQSBTRVJFTSBBUExJQ0FET1MNCg0KbGltaXRlc19pZGFkZSA8LSBjKDE4LCAyMCwgMzAsIDQwLCA1MCkNCg0KDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShMSU1JVF9BR0UgPSBjdXQoQUdFLCBicmVha3MgPSBsaW1pdGVzX2lkYWRlLCBsYWJlbHMgPQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiMTgtMjAiLCAiMjEtMzAiLCAiMzEtNDAiLCAiNDEtNTAiKSkpICU+JSANCiAgYXJyYW5nZShBR0UpDQogIA0KZGF0YQ0KDQojIENhbGN1bGFyIG8gWi1zY29yZSB1c2FuZG8gYXMgY29uc3RhbnRlcyBwYXJhIGNhZGEgZmFpeGEgZXTDoXJpYQ0KDQoNCiNCUEFfQ09OQw0KDQpCUEFfQ09OQ19Fc2NvcmVaIDwtIGRhdGEgJT4lDQogIG11dGF0ZShCUEFfQ09OQ19Fc2NvcmVaID0gY2FzZV93aGVuKA0KICAgIExJTUlUX0FHRSA9PSAiMTgtMjAiIH4gKEJQQV9DT05DX1BPSU5UUyAtIDg1Ljc5KSAvIDIyLjUzLA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKEJQQV9DT05DX1BPSU5UUyAtIDg3LjA4KSAvIDIxLjUwLA0KICAgIExJTUlUX0FHRSA9PSAiMzEtNDAiIH4gKEJQQV9DT05DX1BPSU5UUyAtIDg1LjQ4KSAvIDIyLjU2LA0KICAgIExJTUlUX0FHRSA9PSAiNDEtNTAiIH4gKEJQQV9DT05DX1BPSU5UUyAtIDgwLjcyKSAvIDIyLjg1LA0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsIEFHRSxHUk9VUCxFRFVfTEVWRUwsIExJTUlUX0FHRSxCUEFfQ09OQ19QT0lOVFMsIEJQQV9DT05DX0VzY29yZVopICU+JSANCiAgYXJyYW5nZShJRCkNCg0KQlBBX0NPTkNfRXNjb3JlWg0KDQoNCiNCUEFfRElWRA0KDQpCUEFfRElWSURfRXNjb3JlWiA8LSBkYXRhICU+JQ0KICBtdXRhdGUoQlBBX0RJVklEX0VzY29yZVogPSBjYXNlX3doZW4oDQogICAgTElNSVRfQUdFID09ICIxOC0yMCIgfiAoQlBBX0RJVklEX1BPSU5UUyAtIDc5LjQyKSAvIDIzLjQ5LA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKEJQQV9ESVZJRF9QT0lOVFMgLSA3Ny4xOSkgLyAyNC40MiwNCiAgICBMSU1JVF9BR0UgPT0gIjMxLTQwIiB+IChCUEFfRElWSURfUE9JTlRTIC0gNzEuMjgpIC8gMjUuMzMsDQogICAgTElNSVRfQUdFID09ICI0MS01MCIgfiAoQlBBX0RJVklEX1BPSU5UUyAtIDYxLjIyKSAvIDI2LjUzLA0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsQlBBX0RJVklEX1BPSU5UUywgQlBBX0RJVklEX0VzY29yZVopICU+JSANCiAgYXJyYW5nZShJRCkNCg0KQlBBX0RJVklEX0VzY29yZVoNCg0KDQojQlBBX0FMVEVSTg0KDQpCUEFfQUxURVJOX0VzY29yZVogPC0gZGF0YSAlPiUNCiAgbXV0YXRlKEJQQV9BTFRFUk5fRXNjb3JlWiA9IGNhc2Vfd2hlbigNCiAgICBMSU1JVF9BR0UgPT0gIjE4LTIwIiB+IChCUEFfQUxURVJOX1BPSU5UUyAtIDkzLjIxKSAvIDIxLjc2LA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKEJQQV9BTFRFUk5fUE9JTlRTIC0gODcuNTMpIC8gMjMuNTYsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoQlBBX0FMVEVSTl9QT0lOVFMgLSA4Mi4yOCkgLyAyNC44NCwNCiAgICBMSU1JVF9BR0UgPT0gIjQxLTUwIiB+IChCUEFfQUxURVJOX1BPSU5UUyAtIDcyLjcwKSAvIDI1LjgwLA0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsQlBBX0FMVEVSTl9QT0lOVFMsIEJQQV9BTFRFUk5fRXNjb3JlWikgJT4lIA0KICBhcnJhbmdlKElEKQ0KDQpCUEFfQUxURVJOX0VzY29yZVogDQoNCg0KI0JQQV9UT1RBTA0KDQpCUEFfVE9UQUxfRXNjb3JlWiA8LSBkYXRhICU+JQ0KICBtdXRhdGUoQlBBX1RPVEFMX0VzY29yZVogPSBjYXNlX3doZW4oDQogICAgTElNSVRfQUdFID09ICIxOC0yMCIgfiAoQlBBX1RPVEFMIC0gMjU4LjQyKSAvIDU2LjU5LA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKEJQQV9UT1RBTCAtIDI1MS43OSkgLyA1OC42MSwNCiAgICBMSU1JVF9BR0UgPT0gIjMxLTQwIiB+IChCUEFfVE9UQUwgLSAyMzkuMDQpIC8gNjIuNzcsDQogICAgTElNSVRfQUdFID09ICI0MS01MCIgfiAoQlBBX1RPVEFMIC0gMjE0LjY1KSAvIDY0LjMzLA0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JS0NCiAgc2VsZWN0KElELEJQQV9UT1RBTCwgQlBBX1RPVEFMX0VzY29yZVopICU+JSANCiAgYXJyYW5nZShJRCkNCg0KQlBBX1RPVEFMX0VzY29yZVoNCg0KDQoNCkJQQXNfRXNjb3JlWiA8LSBiaW5kX2NvbHMoQlBBX0NPTkNfRXNjb3JlWiwgQlBBX0RJVklEX0VzY29yZVosIEJQQV9BTFRFUk5fRXNjb3JlWiwgQlBBX1RPVEFMX0VzY29yZVopICU+JSANCiAgICAgICAgICBuYS5vbWl0KCkNCg0Kd3JpdGUueGxzeChCUEFzX0VzY29yZVosIGZpbGUgPSAiQlBBc19Fc2NvcmVaLnhsc3giKQ0KDQoNCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEZEVCBaLVNjb3JlICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQoNCmRhdGEgPC0gcmVhZHhsOjpyZWFkX3hsc3ggKCJEQURPU19CUlVUT1NfQ09WSURfTE9OR0FfUFJFRU5DSEVORE8ueGxzeCIpDQoNCmRhdGEgPC0gbmEub21pdChkYXRhKQ0KDQoNCiAgICAgICAgICAgICAgICAjIERFVEVSTUlOQU5ETyBMSU1JVEVTIEEgU0VSRU0gQVBMSUNBRE9TDQoNCmxpbWl0ZXNfaWRhZGUgPC0gYygxOCwgMTksIDM0LCA1MCkNCg0KICAgICAgICAgICAgICAgICMgQURJQ0lPTkFORE8gQ09MVU5BIEFPIERBRE8sIFJFTEFDSU9OQURPIEFPUyBMSU1JVEVTIERFU0VKQURPUw0KDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShMSU1JVF9BR0UgPSBjdXQoQUdFLCBicmVha3MgPSBsaW1pdGVzX2lkYWRlLCBsYWJlbHMgPQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiMTgiLCAiMTktMzQiLCAiMzUtNTAiKSkpICU+JSANCiAgYXJyYW5nZShBR0UpDQogIA0KZGF0YQ0KDQoNCiNGRFQgUkVBRElORw0KDQpGRFRfUkVBRElOR19USU1FX1ogPC0gZGF0YSAlPiUNCiAgbXV0YXRlKEZEVF9SRUFESU5HX1RJTUVfWiA9IGNhc2Vfd2hlbigNCiAgICBMSU1JVF9BR0UgPT0gIjE4IiB+IChGRFRfUkVBRElOR19USU1FIC0gMjAuNCkgLyA0LjEsDQogICAgTElNSVRfQUdFID09ICIxOS0zNCIgfiAoRkRUX1JFQURJTkdfVElNRSAtIDIyKSAvIDUuNiwNCiAgICBMSU1JVF9BR0UgPT0gIjM1LTUwIiB+IChGRFRfUkVBRElOR19USU1FIC0gMjMuOSkgLyA2LjUsDQogICAgVFJVRSB+IE5BX3JlYWxfICAjIENhc28gcGFkcsOjbyBwYXJhIG91dHJhcyBmYWl4YXMgZXTDoXJpYXMNCiAgKSkgJT4lDQogIHNlbGVjdChJRCxBR0UsIEVEVV9MRVZFTCxHUk9VUCwgTElNSVRfQUdFLEZEVF9SRUFESU5HX1RJTUUsICBGRFRfUkVBRElOR19USU1FX1opICU+JSANCiAgYXJyYW5nZShJRCkNCg0KDQpGRFRfUkVBRElOR19USU1FX1oNCg0KDQoNCiNGRFQgQ09VVElORw0KDQpGRFRfQ09VTlRJTkdfVElNRV9aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShGRFRfQ09VTlRJTkdfVElNRV9aID0gY2FzZV93aGVuKA0KICAgIExJTUlUX0FHRSA9PSAiMTgiIH4gKEZEVF9DT1VOVElOR19USU1FIC0gMjMuOCkgLyAzLjUsDQogICAgTElNSVRfQUdFID09ICIxOS0zNCIgfiAoRkRUX0NPVU5USU5HX1RJTUUgLSAyNC4yKSAvIDUuMiwNCiAgICBMSU1JVF9BR0UgPT0gIjM1LTUwIiB+IChGRFRfQ09VTlRJTkdfVElNRSAtIDI3LjEpIC8gNy4yLA0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsRkRUX0NPVU5USU5HX1RJTUUsIEZEVF9DT1VOVElOR19USU1FX1opICU+JSANCiAgYXJyYW5nZShJRCkNCg0KDQpGRFRfQ09VTlRJTkdfVElNRV9aDQoNCg0KI0ZEVCBDSE9PU0lORw0KDQpGRFRfQ0hPT1NJTkdfVElNRV9aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShGRFRfQ0hPT1NJTkdfVElNRV9aID0gY2FzZV93aGVuKA0KICAgIExJTUlUX0FHRSA9PSAiMTgiIH4gKEZEVF9DSE9PU0lOR19USU1FIC0gMzQpIC8gNS45LA0KICAgIExJTUlUX0FHRSA9PSAiMTktMzQiIH4gKEZEVF9DSE9PU0lOR19USU1FIC0gMzYuOSkgLyAxMCwNCiAgICBMSU1JVF9BR0UgPT0gIjM1LTUwIiB+IChGRFRfQ0hPT1NJTkdfVElNRSAtIDQxLjcpIC8gMTQuNSwNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELEZEVF9DSE9PU0lOR19USU1FLCBGRFRfQ0hPT1NJTkdfVElNRV9aKSAlPiUgDQogIGFycmFuZ2UoSUQpDQoNCg0KRkRUX0NIT09TSU5HX1RJTUVfWg0KDQoNCg0KI0ZEVCBDSEFOR0lORw0KDQpGRFRfQ0hBTkdJTkdfVElNRV9aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShGRFRfQ0hBTkdJTkdfVElNRV9aID0gY2FzZV93aGVuKA0KICAgIExJTUlUX0FHRSA9PSAiMTgiIH4gKEZEVF9DSEFOR0lOR19USU1FIC0gNDQuOCkgLyA5LjEsDQogICAgTElNSVRfQUdFID09ICIxOS0zNCIgfiAoRkRUX0NIQU5HSU5HX1RJTUUgLSA0NikgLyAxMywNCiAgICBMSU1JVF9BR0UgPT0gIjM1LTUwIiB+IChGRFRfQ0hBTkdJTkdfVElNRSAtIDUzLjYpIC8gMTguNCwNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELEZEVF9DSEFOR0lOR19USU1FLCBGRFRfQ0hBTkdJTkdfVElNRV9aKSAlPiUgDQogIGFycmFuZ2UoSUQpDQoNCg0KRkRUX0NIQU5HSU5HX1RJTUVfWg0KDQoNCg0KDQojRkRUIElOSElCSVRJT04NCg0KRkRUX0lOSElCSVRJT05fWiA8LSBkYXRhICU+JQ0KICBtdXRhdGUoRkRUX0lOSElCSVRJT05fWiA9IGNhc2Vfd2hlbigNCiAgICBMSU1JVF9BR0UgPT0gIjE4IiB+IChGRFRfSU5ISUJJVElPTiAtIDEzLjYpIC8gNC45LA0KICAgIExJTUlUX0FHRSA9PSAiMTktMzQiIH4gKEZEVF9JTkhJQklUSU9OIC0gMTQuOCkgLyA4LjMsDQogICAgTElNSVRfQUdFID09ICIzNS01MCIgfiAoRkRUX0lOSElCSVRJT04gLSAxNy44KSAvIDEyLA0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsRkRUX0lOSElCSVRJT04sIEZEVF9JTkhJQklUSU9OX1opICU+JSANCiAgYXJyYW5nZShJRCkNCg0KDQpGRFRfSU5ISUJJVElPTl9aDQoNCg0KDQoNCiNGRFQgRkxFWEJJTElUWQ0KDQpGRFRfRkxFWElCSUxJVFlfWiA8LSBkYXRhICU+JQ0KICBtdXRhdGUoRkRUX0ZMRVhJQklMSVRZX1ogPSBjYXNlX3doZW4oDQogICAgTElNSVRfQUdFID09ICIxOCIgfiAoRkRUX0ZMRVhJQklMSVRZIC0gMjQuNCkgLyA3LjgsDQogICAgTElNSVRfQUdFID09ICIxOS0zNCIgfiAoRkRUX0ZMRVhJQklMSVRZIC0gMjMuOSkgLyAxMC44LA0KICAgIExJTUlUX0FHRSA9PSAiMzUtNTAiIH4gKEZEVF9GTEVYSUJJTElUWSAtIDI5LjcpIC8gMTUuNywNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELEZEVF9GTEVYSUJJTElUWSwgRkRUX0ZMRVhJQklMSVRZX1opICU+JSANCiAgYXJyYW5nZShJRCkNCg0KDQpGRFRfRkxFWElCSUxJVFlfWg0KDQoNCg0KI0JJTkQgQ09MUyBFIFNBTFZBUg0KDQpGRFRfRXNjb3JlWiA8LSBiaW5kX2NvbHMoRkRUX1JFQURJTkdfVElNRV9aLEZEVF9DT1VOVElOR19USU1FX1osRkRUX0NIT09TSU5HX1RJTUVfWiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBGRFRfQ0hBTkdJTkdfVElNRV9aLEZEVF9JTkhJQklUSU9OX1osRkRUX0ZMRVhJQklMSVRZX1opDQoNCg0KDQp3cml0ZS54bHN4KEZEVF9Fc2NvcmVaLCBmaWxlID0gIkZEVF9Fc2NvcmVaLnhsc3giKQ0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBSQVZMVFMgWi1TY29yZSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpkYXRhIDwtIHJlYWR4bDo6cmVhZF94bHN4ICgiREFET1NfQlJVVE9TX0NPVklEX0xPTkdBX1BSRUVOQ0hFTkRPLnhsc3giKQ0KDQpkYXRhIDwtIG5hLm9taXQoZGF0YSkNCg0KDQoNCmxpbWl0ZXNfaWRhZGUgPC0gYygxOCwgMjAsIDMwLCA0MCwgNTApDQoNCg0KZGF0YSA8LSBkYXRhICU+JQ0KICBtdXRhdGUoTElNSVRfQUdFID0gDQogICAgICAgICAgIGN1dChBR0UsIGJyZWFrcyA9IGxpbWl0ZXNfaWRhZGUsIGxhYmVscyA9IA0KICAgICAgICAgICAgICAgICBjKCIxOC0yMCIsICIyMS0zMCIsICIzMS00MCIsICI0MS01MCIpKSkgJT4lIA0KICBhcnJhbmdlKEFHRSkgDQogIA0KZGF0YQ0KDQoNCiNSQVZMVCBBMQ0KDQpSQVZMVF9BMV9aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSQVZMVF9BMV9aID0gY2FzZV93aGVuKA0KICAgIExJTUlUX0FHRSA9PSAiMTgtMjAiIH4gKFJBVkxUX0ExIC0gNi44KSAvIDEuNywNCiAgICBMSU1JVF9BR0UgPT0gIjIxLTMwIiB+IChSQVZMVF9BMSAtIDYuNSkgLyAxLjcsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoUkFWTFRfQTEgLSA2LjEpIC8gMS42LA0KICAgIExJTUlUX0FHRSA9PSAiNDEtNTAiIH4gKFJBVkxUX0ExIC0gNikgLyAxLjYsDQoNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELCBBR0UsRURVX0xFVkVMLEdST1VQLCBMSU1JVF9BR0UsUkFWTFRfQTEsICBSQVZMVF9BMV9aKSAlPiUgDQogIGFycmFuZ2UoSUQpDQoNCg0KUkFWTFRfQTFfWiANCg0KDQoNCg0KI1JBVkxUIEEyDQoNClJBVkxUX0EyX1ogPC0gZGF0YSAlPiUNCiAgbXV0YXRlKFJBVkxUX0EyX1ogPSBjYXNlX3doZW4oDQogICAgTElNSVRfQUdFID09ICIxOC0yMCIgfiAoUkFWTFRfQTIgLSA5LjUpIC8gMi4yLA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKFJBVkxUX0EyIC0gOC45KSAvIDIuMiwNCiAgICBMSU1JVF9BR0UgPT0gIjMxLTQwIiB+IChSQVZMVF9BMiAtIDguNykgLyAyLA0KICAgIExJTUlUX0FHRSA9PSAiNDEtNTAiIH4gKFJBVkxUX0EyIC0gOC41KSAvIDIsDQoNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELFJBVkxUX0EyLCBSQVZMVF9BMl9aKSAlPiUgDQogIGFycmFuZ2UoSUQpDQoNCg0KUkFWTFRfQTJfWg0KDQoNCiNSQVZMVCBBMw0KDQpSQVZMVF9BM19aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSQVZMVF9BM19aID0gY2FzZV93aGVuKA0KICAgIExJTUlUX0FHRSA9PSAiMTgtMjAiIH4gKFJBVkxUX0EzIC0gMTEpIC8gMi4yLA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKFJBVkxUX0EzIC0gMTAuNCkgLyAyLjQsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoUkFWTFRfQTMgLSAxMC4zKSAvIDIuMSwNCiAgICBMSU1JVF9BR0UgPT0gIjQxLTUwIiB+IChSQVZMVF9BMyAtIDkuOCkgLyAyLjUsDQoNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELFJBVkxUX0EzLCBSQVZMVF9BM19aKSAlPiUgDQogIGFycmFuZ2UoSUQpDQoNCg0KUkFWTFRfQTNfWg0KDQoNCg0KI1JBVkxUIEE0DQoNClJBVkxUX0E0X1ogPC0gZGF0YSAlPiUNCiAgbXV0YXRlKFJBVkxUX0E0X1ogPSBjYXNlX3doZW4oDQogICAgTElNSVRfQUdFID09ICIxOC0yMCIgfiAoUkFWTFRfQTQgLSAxMS44KSAvIDIuNCwNCiAgICBMSU1JVF9BR0UgPT0gIjIxLTMwIiB+IChSQVZMVF9BNCAtIDExLjQpIC8gMi40LA0KICAgIExJTUlUX0FHRSA9PSAiMzEtNDAiIH4gKFJBVkxUX0E0IC0gMTEuNCkgLyAyLjEsDQogICAgTElNSVRfQUdFID09ICI0MS01MCIgfiAoUkFWTFRfQTQgLSAxMC43KSAvIDIuNywNCg0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsUkFWTFRfQTQsUkFWTFRfQTRfWikgJT4lIA0KICBhcnJhbmdlKElEKQ0KDQoNClJBVkxUX0E0X1oNCg0KDQoNCg0KDQojUkFWTFQgQTUNCg0KUkFWTFRfQTVfWiA8LSBkYXRhICU+JQ0KICBtdXRhdGUoUkFWTFRfQTVfWiA9IGNhc2Vfd2hlbigNCiAgICBMSU1JVF9BR0UgPT0gIjE4LTIwIiB+IChSQVZMVF9BNSAtIDEyLjIpIC8gMi40LA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKFJBVkxUX0E1IC0gMTIuMikgLyAyLjIsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoUkFWTFRfQTUgLSAxMi4yKSAvIDIuMiwNCiAgICBMSU1JVF9BR0UgPT0gIjQxLTUwIiB+IChSQVZMVF9BNSAtIDExLjcpIC8gMi42LA0KDQogICAgVFJVRSB+IE5BX3JlYWxfICAjIENhc28gcGFkcsOjbyBwYXJhIG91dHJhcyBmYWl4YXMgZXTDoXJpYXMNCiAgKSkgJT4lDQogIHNlbGVjdChJRCxSQVZMVF9BNSwgUkFWTFRfQTVfWikgJT4lIA0KICBhcnJhbmdlKElEKQ0KDQoNClJBVkxUX0E1X1oNCg0KDQoNCg0KI1JBVkxUICBCMQ0KDQpSQVZMVF9CMV9aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSQVZMVF9CMV9aID0gY2FzZV93aGVuKA0KICAgIExJTUlUX0FHRSA9PSAiMTgtMjAiIH4gKFJBVkxUX0IxIC0gNi4zKSAvIDEuOCwNCiAgICBMSU1JVF9BR0UgPT0gIjIxLTMwIiB+IChSQVZMVF9CMSAtIDUuNykgLyAxLjgsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoUkFWTFRfQjEgLSA1LjMpIC8gMS42LA0KICAgIExJTUlUX0FHRSA9PSAiNDEtNTAiIH4gKFJBVkxUX0IxIC0gNC45KSAvIDEuNiwNCg0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsUkFWTFRfQjEsIFJBVkxUX0IxX1opICU+JSANCiAgYXJyYW5nZShJRCkNCg0KDQpSQVZMVF9CMV9aDQoNCg0KDQojUkFWTFQgQTYNCg0KUkFWTFRfQTZfWiA8LSBkYXRhICU+JQ0KICBtdXRhdGUoUkFWTFRfQTZfWiA9IGNhc2Vfd2hlbigNCiAgICBMSU1JVF9BR0UgPT0gIjE4LTIwIiB+IChSQVZMVF9BNiAtIDExLjEpIC8gMi41LA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKFJBVkxUX0E2IC0gMTAuOSkgLyAyLjYsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoUkFWTFRfQTYgLSAxMC44KSAvIDIuNCwNCiAgICBMSU1JVF9BR0UgPT0gIjQxLTUwIiB+IChSQVZMVF9BNiAtIDkuOCkgLyAyLjgsDQoNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELFJBVkxUX0E2LCBSQVZMVF9BNl9aKSAlPiUgDQogIGFycmFuZ2UoSUQpDQoNCg0KUkFWTFRfQTZfWg0KDQoNCiNSQVZMVCBBNw0KDQpSQVZMVF9BN19aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSQVZMVF9BN19aID0gY2FzZV93aGVuKA0KICAgIExJTUlUX0FHRSA9PSAiMTgtMjAiIH4gKFJBVkxUX0E3IC0gMTEpIC8gMi43LA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKFJBVkxUX0E3IC0gMTAuNykgLyAyLjcsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoUkFWTFRfQTcgLSAxMC4zKSAvIDIuNCwNCiAgICBMSU1JVF9BR0UgPT0gIjQxLTUwIiB+IChSQVZMVF9BNyAtIDkuNikgLyAyLjgsDQoNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELFJBVkxUX0E3LFJBVkxUX0E3X1opICU+JSANCiAgYXJyYW5nZShJRCkNCg0KDQpSQVZMVF9BN19aDQoNCg0KDQojUkFWTFQgUkVDDQoNClJBVkxUX1JFQ19aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSQVZMVF9SRUNfWiA9IGNhc2Vfd2hlbigNCiAgICBMSU1JVF9BR0UgPT0gIjE4LTIwIiB+IChSQVZMVF9SRUMgLSAxMCkgLyA1LjcsDQogICAgTElNSVRfQUdFID09ICIyMS0zMCIgfiAoUkFWTFRfUkVDIC0gMTEuNCkgLyA0LjcsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoUkFWTFRfUkVDIC0gMTEuMSkgLyA0LjcsDQogICAgTElNSVRfQUdFID09ICI0MS01MCIgfiAoUkFWTFRfUkVDIC0gOS45KSAvIDUuNiwNCg0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsUkFWTFRfUkVDLFJBVkxUX1JFQ19aKSAlPiUgDQogIGFycmFuZ2UoSUQpDQoNCg0KUkFWTFRfUkVDX1oNCg0KDQoNCiNSQVZMVF9UT1RBTFNDT1JFDQoNCg0KUkFWTFRfVE9UQUxTQ09SRV9aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSQVZMVF9UT1RBTFNDT1JFX1ogPSBjYXNlX3doZW4oDQogICAgTElNSVRfQUdFID09ICIxOC0yMCIgfiAoUkFWTFRfVE9UQUxTQ09SRSAtIDUxLjQpIC8gOC43LA0KICAgIExJTUlUX0FHRSA9PSAiMjEtMzAiIH4gKFJBVkxUX1RPVEFMU0NPUkUgLSA0OS4zKSAvIDguNiwNCiAgICBMSU1JVF9BR0UgPT0gIjMxLTQwIiB+IChSQVZMVF9UT1RBTFNDT1JFIC0gNDguNikgLyA4LA0KICAgIExJTUlUX0FHRSA9PSAiNDEtNTAiIH4gKFJBVkxUX1RPVEFMU0NPUkUgLSA0Ni43KSAvIDkuNiwNCg0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsUkFWTFRfVE9UQUxTQ09SRSwgUkFWTFRfVE9UQUxTQ09SRV9aKSAlPiUgDQogIGFycmFuZ2UoSUQpDQoNClJBVkxUX1RPVEFMU0NPUkVfWg0KDQoNCg0KI1JBVkxUX0FMVA0KDQpSQVZMVF9BTFRfWiA8LSBkYXRhICU+JQ0KICBtdXRhdGUoUkFWTFRfQUxUX1ogPSBjYXNlX3doZW4oDQogICAgTElNSVRfQUdFID09ICIxOC0yMCIgfiAoUkFWTFRfQUxUIC0gMTcuMykgLyA3LjMsDQogICAgTElNSVRfQUdFID09ICIyMS0zMCIgfiAoUkFWTFRfQUxUIC0gMTYuOCkgLyA2LjUsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoUkFWTFRfQUxUIC0gMTcuOSkgLyA3LA0KICAgIExJTUlUX0FHRSA9PSAiNDEtNTAiIH4gKFJBVkxUX0FMVCAtIDE2LjUpIC8gNy4zLA0KDQogICAgVFJVRSB+IE5BX3JlYWxfICAjIENhc28gcGFkcsOjbyBwYXJhIG91dHJhcyBmYWl4YXMgZXTDoXJpYXMNCiAgKSkgJT4lDQogIHNlbGVjdChJRCxSQVZMVF9BTFQsIFJBVkxUX0FMVF9aKSAlPiUgDQogIGFycmFuZ2UoSUQpDQoNCg0KDQoNClJBVkxUX0FMVF9aDQoNCg0KDQojUkFWTFRfUkVURU5USU9ODQoNClJBVkxUX1JFVEVOVElPTl9aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSQVZMVF9SRVRFTlRJT05fWiA9IGNhc2Vfd2hlbigNCiAgICBMSU1JVF9BR0UgPT0gIjE4LTIwIiB+IChSQVZMVF9SRVRFTlRJT04gLSAxKSAvIDAuMiwNCiAgICBMSU1JVF9BR0UgPT0gIjIxLTMwIiB+IChSQVZMVF9SRVRFTlRJT04gLSAxKSAvIDAuMjcsDQogICAgTElNSVRfQUdFID09ICIzMS00MCIgfiAoUkFWTFRfUkVURU5USU9OIC0gMC45NykgLyAwLjE5LA0KICAgIExJTUlUX0FHRSA9PSAiNDEtNTAiIH4gKFJBVkxUX1JFVEVOVElPTiAtIDEuMDEpIC8gMC4zNCwNCg0KICAgIFRSVUUgfiBOQV9yZWFsXyAgIyBDYXNvIHBhZHLDo28gcGFyYSBvdXRyYXMgZmFpeGFzIGV0w6FyaWFzDQogICkpICU+JQ0KICBzZWxlY3QoSUQsUkFWTFRfUkVURU5USU9OLCBSQVZMVF9SRVRFTlRJT05fWikgJT4lIA0KICBhcnJhbmdlKElEKQ0KDQoNClJBVkxUX1JFVEVOVElPTl9aDQoNCg0KDQojUkFWTFRfUFJPQVRfSU5URVJGRVJFTkNFDQoNClJBVkxUX1BST0FUX0lOVEVSRkVSRU5DRV9aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSQVZMVF9QUk9BVF9JTlRFUkZFUkVOQ0VfWiA9IGNhc2Vfd2hlbigNCiAgICBMSU1JVF9BR0UgPT0gIjE4LTIwIiB+IChSQVZMVF9QUk9BVF9JTlRFUkZFUkVOQ0UgLSAwLjk2KSAvIDAuMzMsDQogICAgTElNSVRfQUdFID09ICIyMS0zMCIgfiAoUkFWTFRfUFJPQVRfSU5URVJGRVJFTkNFIC0gMC45MikgLyAwLjM3LA0KICAgIExJTUlUX0FHRSA9PSAiMzEtNDAiIH4gKFJBVkxUX1BST0FUX0lOVEVSRkVSRU5DRSAtIDAuOTEpIC8gMC4zMywNCiAgICBMSU1JVF9BR0UgPT0gIjQxLTUwIiB+IChSQVZMVF9QUk9BVF9JTlRFUkZFUkVOQ0UgLSAwLjg2KSAvIDAuMzEsDQoNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELFJBVkxUX1BST0FUX0lOVEVSRkVSRU5DRSwgUkFWTFRfUFJPQVRfSU5URVJGRVJFTkNFX1opICU+JSANCiAgYXJyYW5nZShJRCkNCg0KDQpSQVZMVF9QUk9BVF9JTlRFUkZFUkVOQ0VfWg0KDQoNCg0KDQojUkFWTFRfUkVUUk9fSU5URVJGRVJFTkNFDQoNClJBVkxUX1JFVFJPX0lOVEVSRkVSRU5DRV9aIDwtIGRhdGEgJT4lDQogIG11dGF0ZShSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0VfWiA9IGNhc2Vfd2hlbigNCiAgICBMSU1JVF9BR0UgPT0gIjE4LTIwIiB+IChSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0UgLSAwLjk2KSAvIDAuNjgsDQogICAgTElNSVRfQUdFID09ICIyMS0zMCIgfiAoUkFWTFRfUkVUUk9fSU5URVJGRVJFTkNFIC0gMC44OSkgLyAwLjE3LA0KICAgIExJTUlUX0FHRSA9PSAiMzEtNDAiIH4gKFJBVkxUX1JFVFJPX0lOVEVSRkVSRU5DRSAtIDAuOTQpIC8gMC43NCwNCiAgICBMSU1JVF9BR0UgPT0gIjQxLTUwIiB+IChSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0UgLSAwLjg0KSAvIDAuMTgsDQoNCiAgICBUUlVFIH4gTkFfcmVhbF8gICMgQ2FzbyBwYWRyw6NvIHBhcmEgb3V0cmFzIGZhaXhhcyBldMOhcmlhcw0KICApKSAlPiUNCiAgc2VsZWN0KElELFJBVkxUX1JFVFJPX0lOVEVSRkVSRU5DRSwgUkFWTFRfUkVUUk9fSU5URVJGRVJFTkNFX1opICU+JSANCiAgYXJyYW5nZShJRCkNCg0KDQpSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0VfWg0KDQoNCg0KDQojQklORCBDT0xTIEUgU0FMVkFSDQoNClJBVkxUc19Fc2NvcmVaIDwtIGJpbmRfY29scyhSQVZMVF9BMV9aLCBSQVZMVF9BMl9aLCBSQVZMVF9BM19aLCBSQVZMVF9BNF9aLCBSQVZMVF9BNV9aLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVkxUX0IxX1osIFJBVkxUX0E2X1osIFJBVkxUX0E3X1osIFJBVkxUX1JFQ19aLCBSQVZMVF9UT1RBTFNDT1JFX1osDQogICAgICAgICAgICAgICAgICAgICAgICAgICBSQVZMVF9SRVRFTlRJT05fWiwgUkFWTFRfUFJPQVRfSU5URVJGRVJFTkNFX1osIFJBVkxUX1JFVFJPX0lOVEVSRkVSRU5DRV9aICkgDQoNCg0KDQp3cml0ZS54bHN4KFJBVkxUc19Fc2NvcmVaLCBmaWxlID0gIlJBVkxUc19Fc2NvcmVaLnhsc3giKQ0KDQoNCg0KDQpgYGANCg0KDQpgYGB7ciBCdWJibGUgUGxvdHN9DQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ3RFeHRyYXMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkoaHJicnRoZW1lcykNCg0KDQojc2V0d2QoIkM6L1VzZXJzL2ZlbGlwL0Rlc2t0b3AvUi8zX2FuYWxpc2UiKQ0KDQpnZXR3ZCgpDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgQlBBcyBac2NvcmUgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KZGF0YSA8LSByZWFkeGw6OnJlYWRfeGxzeCAoIkJQQXNfRXNjb3JlWi54bHN4Iiwgc2hlZXQgPSAxKQ0KDQpzdW1tYXJ5KGRhdGEpDQpjb2xuYW1lcyhkYXRhKQ0KDQpkYXRhIDwtIGRhdGEgJT4lIHJlbmFtZShJRCA9IElELi4uMSkgJT4lIHNlbGVjdCgtSUQuLi44LC1JRC4uLjExLC1JRC4uLjE0KQ0KICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEZpbHRyYW5kbyBkYWRvcyBCUEFzDQoNCnAxIDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsRURVX0xFVkVMICwgQUdFLCBCUEFfQ09OQ19QT0lOVFMgLCBCUEFfQ09OQ19Fc2NvcmVaICApDQoNCnAyIDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsRURVX0xFVkVMLCBBR0UsIEJQQV9ESVZJRF9QT0lOVFMgLCBCUEFfRElWSURfRXNjb3JlWiAgKQ0KDQpwMyA8LSBkYXRhICU+JSAgc2VsZWN0KElELEVEVV9MRVZFTCAsR1JPVVAgLEVEVV9MRVZFTCAsQUdFLCBCUEFfQUxURVJOX1BPSU5UUyAsIEJQQV9BTFRFUk5fRXNjb3JlWiApDQoNCnB0b3RhbCA8LSBkYXRhICU+JSAgc2VsZWN0KElELEVEVV9MRVZFTCAsR1JPVVAgLEVEVV9MRVZFTCAsQUdFLCBCUEFfQUxURVJOX1BPSU5UUyAsIEJQQV9BTFRFUk5fRXNjb3JlWiApDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBQMSAgDQogIA0KDQpjb3Jlc0JQQSA8LSBjKCIjMWEyODg3IiwgIiM3OTlkZTQiKQ0KDQoNCg0KcDEgPC0gZGF0YSAlPiUgDQogIGFycmFuZ2UoSUQpICU+JSANCiAgbXV0YXRlKHRleHQgPSBwYXN0ZSgiSWRlbnRpZmljYXRpb246ICIsIElEICwgIlxuQWdlOiAiLCBBR0UgLCANCiAgICAgICAgICAgICAgICAgICAgICAiXG5Qb2ludHM6ICIsIEJQQV9DT05DX1BPSU5UUywNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBCUEFfQ09OQ19Fc2NvcmVaLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gQlBBX0NPTkNfRXNjb3JlWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzQlBBKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDIsIDUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkFnZSIsIGxpbWl0cyA9IGMoMTAsIDUyKSwgYnJlYWtzID0gc2VxKDEwLCA1MCwgYnkgPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiWiBTY29yZSIsIGxpbWl0cyA9IGMoLTMsIDMpLCBicmVha3MgPSBzZXEoLTMsIDMpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0zOjMsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjEpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gInJlZCIsIGFscGhhID0gMC4zLCBsaW5ldHlwZSA9ICIiKSArDQogIGxhYnMoeSA9ICJZIiwgdGl0bGUgPSAiWiBTY29yZSBGb2N1c2VkIEF0dGVudGlvbiIsIHNoYXBlPSAiIiwgc2l6ZSA9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIA0KICAgIHRoZW1lKA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwgTmFycm93Iiwgc2l6ZSA9IDExLjUpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCxmYWNlID0gImJvbGQiKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogICAgDQogICAgICAgICAgICAjIEdyw6FmaWNvIGludGVyYXRpdm8gZGEgYmlibGlvdGV4YSBnZ3Bsb3R0bHkNCg0KcHAxIDwtIGdncGxvdGx5KHAxLCB0b29sdGlwPSJ0ZXh0IikgJT4lDQogIA0KICBsYXlvdXQobGVnZW5kID0gbGlzdCh4ID0gMCwgeSA9IDEuMDEsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIgIiwNCiAgICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiI2VjZjBmMSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJ3aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aCA9IDEsDQogICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChzaXplID0gOSwgZmFtaWx5ID0gIkFyaWFsIiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gNTAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZWdyb3VwZ2FwID0gMjAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZW9yZGVyID0gIm5vcm1hbCINCiAgICAgICAgICAgICAgICAgICAgICkpDQogIA0KDQpwcDENCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgUDINCg0KcDIgPC0gZGF0YSAlPiUNCiAgYXJyYW5nZShJRCkgJT4lDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBCUEFfRElWSURfUE9JTlRTLA0KICAgICAgICAgICAgICAgICAgICAgICJcblotU2NvcmU6ICIsIEJQQV9ESVZJRF9Fc2NvcmVaLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gQlBBX0RJVklEX0VzY29yZVosIGZpbGw9IEdST1VQLCBzdHJva2UgPSAwLA0KICAgICAgICAgICAgIHNpemUgPSBBR0UsIHNoYXBlID0gRURVX0xFVkVMICwgdGV4dCA9IHRleHQpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcsIHBvc2l0aW9uID0gImppdHRlciIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yZXNCUEEpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIERpdmlkIEF0dGVudGlvbiIsIHNoYXBlPSAiIiwgc2l6ZSA9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIA0KICAgIHRoZW1lKA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwgTmFycm93Iiwgc2l6ZSA9IDExLjUpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCxmYWNlID0gImJvbGQiKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogICAgDQoNCg0KICAgICAgICAgICAgICAgICAgICAgICMgR3LDoWZpY28gaW50ZXJhdGl2byBkYSBiaWJsaW90ZXhhIGdncGxvdHRseQ0KDQpwcDIgPC0gZ2dwbG90bHkocDIsIHRvb2x0aXA9InRleHQiKSAlPiUgIA0KIA0KICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIgIiwNCiAgICAgICAgICAgICAgICAgICAgYmdjb2xvciA9ICIjZWNmMGYxIiwNCiAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aCA9IDEsDQogICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSA5LCBmYW1pbHkgPSAiQXJpYWwiLCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICB0cmFjZWdyb3VwZ2FwID0gMjAsDQogICAgICAgICAgICAgICAgICAgIHRyYWNlb3JkZXIgPSAibm9ybWFsIg0KICAgICAgICAgICAgICAgICAgICApKQ0KIA0KcHAyIA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBQMw0KDQpwMyA8LSBkYXRhICU+JSANCiAgbXV0YXRlKHRleHQgPSBwYXN0ZSgiSWRlbnRpZmljYXRpb246ICIsIElEICwgIlxuQWdlOiAiLCBBR0UgLCANCiAgICAgICAgICAgICAgICAgICAgICAiXG5Qb2ludHM6ICIsIEJQQV9BTFRFUk5fUE9JTlRTLA0KICAgICAgICAgICAgICAgICAgICAgICJcblotU2NvcmU6ICIsIEJQQV9BTFRFUk5fRXNjb3JlWiwgc2VwPSIiKSkgJT4lDQogIA0KICBnZ3Bsb3QoYWVzKHggPSBBR0UsIHkgPSBCUEFfQUxURVJOX0VzY29yZVosIGZpbGw9IEdST1VQLCBzdHJva2UgPSAwLA0KICAgICAgICAgICAgIHNpemUgPSBBR0UsIHNoYXBlID0gRURVX0xFVkVMICwgdGV4dCA9IHRleHQpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcscG9zaXRpb24gPSAiaml0dGVyIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb3Jlc0JQQSkgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygyLCA1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBZ2UiLCBsaW1pdHMgPSBjKDEwLCA1MiksIGJyZWFrcyA9IHNlcSgxMCwgNTAsIGJ5ID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIlogU2NvcmUiLCBsaW1pdHMgPSBjKC0zLCAzKSwgYnJlYWtzID0gc2VxKC0zLCAzKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMzozLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC4xKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuMywgbGluZXR5cGUgPSAiIikgKw0KICBsYWJzKHkgPSAiWSIsIHRpdGxlID0gIlogU2NvcmUgQWx0ZXJuIEF0dGVudGlvbiIsIHNoYXBlPSAiIiwgc2l6ZSA9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIA0KICAgIHRoZW1lKA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwgTmFycm93Iiwgc2l6ZSA9IDExLjUpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCxmYWNlID0gImJvbGQiKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogIA0KDQogICAgICAgICAgICAgICAgICAgICMgR3LDoWZpY28gaW50ZXJhdGl2byBkYSBiaWJsaW90ZXhhIGdncGxvdHRseQ0KDQpwcDMgPC0gIGdncGxvdGx5KHAzLCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQoNCnBwMw0KDQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0JQQV9UT1RBTA0KDQpwdG90YWwgPC0gZGF0YSAlPiUgDQogIGFycmFuZ2UoSUQpICU+JSANCiAgbXV0YXRlKHRleHQgPSBwYXN0ZSgiSWRlbnRpZmljYXRpb246ICIsIElEICwgIlxuQWdlOiAiLCBBR0UgLCANCiAgICAgICAgICAgICAgICAgICAgICAiXG5Qb2ludHM6ICIsIEJQQV9UT1RBTCwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBCUEFfVE9UQUxfRXNjb3JlWiwgc2VwPSIiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IEFHRSwgeSA9IEJQQV9UT1RBTF9Fc2NvcmVaLCBmaWxsPSBHUk9VUCwgc3Ryb2tlID0gMCwNCiAgICAgICAgICAgICBzaXplID0gQUdFLCBzaGFwZSA9IEVEVV9MRVZFTCAsIHRleHQgPSB0ZXh0KSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC43LHBvc2l0aW9uID0gImppdHRlciIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yZXNCUEEpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIFRvdGFsIiwgc2hhcGU9ICIiLCBzaXplID0gIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCBOYXJyb3ciLCBzaXplID0gMTEuNSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LGZhY2UgPSAiYm9sZCIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGZhY2UgPSAiaXRhbGljIiksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICIiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KQ0KICAgICkNCiAgICANCiAgICAgICAgICAgICMgR3LDoWZpY28gaW50ZXJhdGl2byBkYSBiaWJsaW90ZXhhIGdncGxvdHRseQ0KDQpwcHRvdGFsIDwtIGdncGxvdGx5KHB0b3RhbCwgdG9vbHRpcD0idGV4dCIpICU+JQ0KICANCiAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KICANCg0KcHB0b3RhbA0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICBGRFRzIFpzY29yZSAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpkYXRhIDwtIHJlYWR4bDo6cmVhZF9leGNlbCgiRkRUX0VzY29yZVoueGxzeCIpDQoNCmRhdGEgPC0gbmEub21pdChkYXRhKQ0KDQpjb2xuYW1lcyhkYXRhKQ0KDQpkYXRhIDwtIGRhdGEgJT4lIHJlbmFtZShJRCA9IElELi4uMSkNCg0KZGF0YQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgRmlsdHJhbmRvIEZEVHMgDQoNCg0KDQpwNCA8LSBkYXRhICU+JSAgc2VsZWN0KElELEVEVV9MRVZFTCAsR1JPVVAgLEFHRSwgRkRUX1JFQURJTkdfVElNRSAsIEZEVF9SRUFESU5HX1RJTUVfWiAgKQ0KDQpwNSA8LSBkYXRhICU+JSAgc2VsZWN0KElELEVEVV9MRVZFTCAsR1JPVVAgLEFHRSwgRkRUX0NPVU5USU5HX1RJTUUgLCBGRFRfQ09VTlRJTkdfVElNRV9aICApDQoNCnA2IDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsQUdFLCBGRFRfQ0hPT1NJTkdfVElNRSAsIEZEVF9DSE9PU0lOR19USU1FX1ogKQ0KDQpwNyA8LSBkYXRhICU+JSAgc2VsZWN0KElELEVEVV9MRVZFTCAsR1JPVVAgLEFHRSwgRkRUX0NIQU5HSU5HX1RJTUUgLCBGRFRfQ0hBTkdJTkdfVElNRV9aICkNCg0KcDggPC0gZGF0YSAlPiUgIHNlbGVjdChJRCxFRFVfTEVWRUwgLEdST1VQICxBR0UsIEZEVF9JTkhJQklUSU9OICwgRkRUX0lOSElCSVRJT05fWiApDQoNCnA5IDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsQUdFLCBGRFRfRkxFWElCSUxJVFkgLCBGRFRfRkxFWElCSUxJVFlfWiApDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgUDQNCg0KDQpjb3Jlc0ZEVCA8LSBjKCIjZjZhM2FiIiwgIiMxYWI2YWMiKQ0KDQoNCg0KcDQgPC0gZGF0YSAlPiUgDQogIGFycmFuZ2UoSUQpICU+JSANCiAgbXV0YXRlKHRleHQgPSBwYXN0ZSgiSWRlbnRpZmljYXRpb246ICIsIElEICwgIlxuQWdlOiAiLCBBR0UgLCANCiAgICAgICAgICAgICAgICAgICAgICAiXG5Qb2ludHM6ICIsIEZEVF9SRUFESU5HX1RJTUUsDQogICAgICAgICAgICAgICAgICAgICAgIlxuWi1TY29yZTogIiwgRkRUX1JFQURJTkdfVElNRV9aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gRkRUX1JFQURJTkdfVElNRV9aLCBmaWxsPSBHUk9VUCwgc3Ryb2tlID0gMCwNCiAgICAgICAgICAgICBzaXplID0gQUdFLCBzaGFwZSA9IEVEVV9MRVZFTCAsIHRleHQgPSB0ZXh0KSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC43LHBvc2l0aW9uID0gImppdHRlciIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yZXNGRFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIEZEVCBSZWFkaW5nIFRpbWUiLCBzaGFwZT0gIiIsIHNpemUgPSAiIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICANCiAgICB0aGVtZSgNCiAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkFyaWFsIE5hcnJvdyIsIHNpemUgPSAxMS41KSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGZhY2UgPSAiaXRhbGljIiksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICIiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KQ0KICAgICkNCiAgICANCg0KcHA0IDwtIGdncGxvdGx5KHA0LCB0b29sdGlwPSJ0ZXh0IikgJT4lDQogIA0KICBsYXlvdXQobGVnZW5kID0gbGlzdCh4ID0gMCwgeSA9IDEuMDEsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIgIiwNCiAgICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiI2VjZjBmMSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJ3aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aCA9IDEsDQogICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChzaXplID0gOSwgZmFtaWx5ID0gIkFyaWFsIiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gNTAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZWdyb3VwZ2FwID0gMjAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZW9yZGVyID0gIm5vcm1hbCINCiAgICAgICAgICAgICAgICAgICAgICkpDQoNCg0KcHA0DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBQNQ0KDQpwNSA8LSBkYXRhICU+JSANCiAgYXJyYW5nZShJRCkgJT4lIA0KICBtdXRhdGUodGV4dCA9IHBhc3RlKCJJZGVudGlmaWNhdGlvbjogIiwgSUQgLCAiXG5BZ2U6ICIsIEFHRSAsIA0KICAgICAgICAgICAgICAgICAgICAgICJcblBvaW50czogIiwgRkRUX0NPVU5USU5HX1RJTUUsDQogICAgICAgICAgICAgICAgICAgICAgIlxuWi1TY29yZTogIiwgRkRUX0NPVU5USU5HX1RJTUVfWiwgc2VwPSIiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IEFHRSwgeSA9IEZEVF9DT1VOVElOR19USU1FX1osIGZpbGw9IEdST1VQLCBzdHJva2UgPSAwLA0KICAgICAgICAgICAgIHNpemUgPSBBR0UsIHNoYXBlID0gRURVX0xFVkVMICwgdGV4dCA9IHRleHQpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcscG9zaXRpb24gPSAiaml0dGVyIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb3Jlc0ZEVCkgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygyLCA1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBZ2UiLCBsaW1pdHMgPSBjKDEwLCA1MiksIGJyZWFrcyA9IHNlcSgxMCwgNTAsIGJ5ID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIlogU2NvcmUiLCBsaW1pdHMgPSBjKC0zLCAzKSwgYnJlYWtzID0gc2VxKC0zLCAzKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMzozLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC4xKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuMywgbGluZXR5cGUgPSAiIikgKw0KICBsYWJzKHkgPSAiWSIsIHRpdGxlID0gIlogU2NvcmUgRkRUIENvdW50aW5nIFRpbWUiLCBzaGFwZT0gIiIsIHNpemUgPSAiIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICANCiAgICB0aGVtZSgNCiAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkFyaWFsIE5hcnJvdyIsIHNpemUgPSAxMS41KSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGZhY2UgPSAiaXRhbGljIiksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICIiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KQ0KICAgICkNCiAgICANCg0KcHA1IDwtIGdncGxvdGx5KHA1LCB0b29sdGlwPSJ0ZXh0IikgJT4lDQogIA0KICBsYXlvdXQobGVnZW5kID0gbGlzdCh4ID0gMCwgeSA9IDEuMDEsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIgIiwNCiAgICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiI2VjZjBmMSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJ3aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aCA9IDEsDQogICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChzaXplID0gOSwgZmFtaWx5ID0gIkFyaWFsIiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gNTAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZWdyb3VwZ2FwID0gMjAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZW9yZGVyID0gIm5vcm1hbCINCiAgICAgICAgICAgICAgICAgICAgICkpDQoNCg0KcHA1DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBQNg0KDQoNCnA2IDwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBGRFRfQ0hPT1NJTkdfVElNRSwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBGRFRfQ0hPT1NJTkdfVElNRV9aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gRkRUX0NIT09TSU5HX1RJTUVfWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzRkRUKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDIsIDUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkFnZSIsIGxpbWl0cyA9IGMoMTAsIDUyKSwgYnJlYWtzID0gc2VxKDEwLCA1MCwgYnkgPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiWiBTY29yZSIsIGxpbWl0cyA9IGMoLTMsIDMpLCBicmVha3MgPSBzZXEoLTMsIDMpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0zOjMsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjEpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gInJlZCIsIGFscGhhID0gMC4zLCBsaW5ldHlwZSA9ICIiKSArDQogIGxhYnMoeSA9ICJZIiwgdGl0bGUgPSAiWiBTY29yZSBGRFQgQ2hvc3NpbmcgVGltZSIsIHNoYXBlPSAiIiwgc2l6ZSA9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIA0KICAgIHRoZW1lKA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwgTmFycm93Iiwgc2l6ZSA9IDExLjUpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFjZSA9ICJpdGFsaWMiKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIiIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpDQogICAgKQ0KICAgIA0KDQpwcDYgPC0gZ2dwbG90bHkocDYsIHRvb2x0aXA9InRleHQiKSAlPiUNCiAgDQogIGxheW91dChsZWdlbmQgPSBsaXN0KHggPSAwLCB5ID0gMS4wMSwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiAiLA0KICAgICAgICAgICAgICAgICAgICAgYmdjb2xvciA9ICIjZWNmMGYxIiwNCiAgICAgICAgICAgICAgICAgICAgIGJvcmRlcmNvbG9yID0gIndoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgIGJvcmRlcndpZHRoID0gMSwNCiAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSA5LCBmYW1pbHkgPSAiQXJpYWwiLCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSA1MCwNCiAgICAgICAgICAgICAgICAgICAgIHRyYWNlZ3JvdXBnYXAgPSAyMCwNCiAgICAgICAgICAgICAgICAgICAgIHRyYWNlb3JkZXIgPSAibm9ybWFsIg0KICAgICAgICAgICAgICAgICAgICAgKSkNCg0KDQpwcDYNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUDcNCg0KDQpwNzwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBGRFRfQ0hBTkdJTkdfVElNRSwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBGRFRfQ0hBTkdJTkdfVElNRV9aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gRkRUX0NIQU5HSU5HX1RJTUVfWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzRkRUKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDIsIDUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkFnZSIsIGxpbWl0cyA9IGMoMTAsIDUyKSwgYnJlYWtzID0gc2VxKDEwLCA1MCwgYnkgPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiWiBTY29yZSIsIGxpbWl0cyA9IGMoLTMsIDMpLCBicmVha3MgPSBzZXEoLTMsIDMpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0zOjMsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjEpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gInJlZCIsIGFscGhhID0gMC4zLCBsaW5ldHlwZSA9ICIiKSArDQogIGxhYnMoeSA9ICJZIiwgdGl0bGUgPSAiWiBTY29yZSBGRFQgQ2hhbmdpbmcgVGltZSIsIHNoYXBlPSAiIiwgc2l6ZSA9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIA0KICAgIHRoZW1lKA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwgTmFycm93Iiwgc2l6ZSA9IDExLjUpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFjZSA9ICJpdGFsaWMiKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIiIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpDQogICAgKQ0KICAgIA0KDQpwcDcgPC0gZ2dwbG90bHkocDcsIHRvb2x0aXA9InRleHQiKSAlPiUNCiAgDQogIGxheW91dChsZWdlbmQgPSBsaXN0KHggPSAwLCB5ID0gMS4wMSwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiAiLA0KICAgICAgICAgICAgICAgICAgICAgYmdjb2xvciA9ICIjZWNmMGYxIiwNCiAgICAgICAgICAgICAgICAgICAgIGJvcmRlcmNvbG9yID0gIndoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgIGJvcmRlcndpZHRoID0gMSwNCiAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSA5LCBmYW1pbHkgPSAiQXJpYWwiLCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSA1MCwNCiAgICAgICAgICAgICAgICAgICAgIHRyYWNlZ3JvdXBnYXAgPSAyMCwNCiAgICAgICAgICAgICAgICAgICAgIHRyYWNlb3JkZXIgPSAibm9ybWFsIg0KICAgICAgICAgICAgICAgICAgICAgKSkNCg0KDQpwcDcNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUDgNCg0KDQpwODwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBGRFRfSU5ISUJJVElPTiwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBGRFRfSU5ISUJJVElPTl9aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gRkRUX0lOSElCSVRJT05fWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzRkRUKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDIsIDUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkFnZSIsIGxpbWl0cyA9IGMoMTAsIDUyKSwgYnJlYWtzID0gc2VxKDEwLCA1MCwgYnkgPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiWiBTY29yZSIsIGxpbWl0cyA9IGMoLTMsIDMpLCBicmVha3MgPSBzZXEoLTMsIDMpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0zOjMsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjEpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gInJlZCIsIGFscGhhID0gMC4zLCBsaW5ldHlwZSA9ICIiKSArDQogIGxhYnMoeSA9ICJZIiwgdGl0bGUgPSAiWiBTY29yZSBGRFQgSW5iaXRpb24iLCBzaGFwZT0gIiIsIHNpemUgPSAiIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICANCiAgICB0aGVtZSgNCiAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkFyaWFsIE5hcnJvdyIsIHNpemUgPSAxMS41KSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGZhY2UgPSAiaXRhbGljIiksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICIiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KQ0KICAgICkNCg0KcHA4IDwtIGdncGxvdGx5KHA4LCB0b29sdGlwPSJ0ZXh0IikgJT4lDQogIA0KICBsYXlvdXQobGVnZW5kID0gbGlzdCh4ID0gMCwgeSA9IDEuMDEsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIgIiwNCiAgICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiI2VjZjBmMSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJ3aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aCA9IDEsDQogICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChzaXplID0gOSwgZmFtaWx5ID0gIkFyaWFsIiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gNTAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZWdyb3VwZ2FwID0gMjAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZW9yZGVyID0gIm5vcm1hbCINCiAgICAgICAgICAgICAgICAgICAgICkpDQoNCg0KcHA4DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIFA5DQoNCnA5PC0gZGF0YSAlPiUgDQogIGFycmFuZ2UoSUQpICU+JSANCiAgbXV0YXRlKHRleHQgPSBwYXN0ZSgiSWRlbnRpZmljYXRpb246ICIsIElEICwgIlxuQWdlOiAiLCBBR0UgLCANCiAgICAgICAgICAgICAgICAgICAgICAiXG5Qb2ludHM6ICIsIEZEVF9GTEVYSUJJTElUWSwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBGRFRfRkxFWElCSUxJVFlfWiwgc2VwPSIiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IEFHRSwgeSA9IEZEVF9GTEVYSUJJTElUWV9aLCBmaWxsPSBHUk9VUCwgc3Ryb2tlID0gMCwNCiAgICAgICAgICAgICBzaXplID0gQUdFLCBzaGFwZSA9IEVEVV9MRVZFTCAsIHRleHQgPSB0ZXh0KSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC43LHBvc2l0aW9uID0gImppdHRlciIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yZXNGRFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIEZEVCBGbGV4aWJpbGl0eSIsIHNoYXBlPSAiIiwgc2l6ZSA9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIA0KICAgIHRoZW1lKA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwgTmFycm93Iiwgc2l6ZSA9IDExLjUpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFjZSA9ICJpdGFsaWMiKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIiIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpDQogICAgKQ0KICAgIA0KDQpwcDkgPC0gZ2dwbG90bHkocDksIHRvb2x0aXA9InRleHQiKSAlPiUNCiAgDQogIGxheW91dChsZWdlbmQgPSBsaXN0KHggPSAwLCB5ID0gMS4wMSwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiAiLA0KICAgICAgICAgICAgICAgICAgICAgYmdjb2xvciA9ICIjZWNmMGYxIiwNCiAgICAgICAgICAgICAgICAgICAgIGJvcmRlcmNvbG9yID0gIndoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgIGJvcmRlcndpZHRoID0gMSwNCiAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSA5LCBmYW1pbHkgPSAiQXJpYWwiLCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSA1MCwNCiAgICAgICAgICAgICAgICAgICAgIHRyYWNlZ3JvdXBnYXAgPSAyMCwNCiAgICAgICAgICAgICAgICAgICAgIHRyYWNlb3JkZXIgPSAibm9ybWFsIg0KICAgICAgICAgICAgICAgICAgICAgKSkNCg0KDQpwcDkNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIFJBVkxUcyBac2NvcmUgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KDQpkYXRhIDwtIHJlYWR4bDo6cmVhZF94bHN4ICgiUkFWTFRzX0VzY29yZVoueGxzeCIpDQoNCmRhdGENCg0KZGF0YSA8LSBkYXRhICU+JSBkcGx5cjo6cmVuYW1lKElEID0gSUQuLi4xKQ0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGaWx0cmFuZG8gUkFWTFRzIA0KDQoNCg0KcDEwIDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsQUdFLCBSQVZMVF9BMSAsIFJBVkxUX0ExX1ogICkNCg0KcDExIDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsQUdFLCBSQVZMVF9BMiAsIFJBVkxUX0EyX1ogICkNCg0KcDEyIDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsQUdFLCBSQVZMVF9BMyAsIFJBVkxUX0EzX1ogKQ0KDQpwMTMgPC0gZGF0YSAlPiUgIHNlbGVjdChJRCxFRFVfTEVWRUwgLEdST1VQICxBR0UsIFJBVkxUX0E0ICwgUkFWTFRfQTRfWiApDQoNCnAxNCA8LSBkYXRhICU+JSAgc2VsZWN0KElELEVEVV9MRVZFTCAsR1JPVVAgLEFHRSwgUkFWTFRfQTUgLCBSQVZMVF9BNV9aICkNCg0KcDE1IDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsQUdFLCBSQVZMVF9CMSAsIFJBVkxUX0IxX1ogKQ0KDQpwMTYgPC0gZGF0YSAlPiUgIHNlbGVjdChJRCxFRFVfTEVWRUwgLEdST1VQICxBR0UsIFJBVkxUX0E2ICwgUkFWTFRfQTZfWiApDQoNCnAxNyA8LSBkYXRhICU+JSAgc2VsZWN0KElELEVEVV9MRVZFTCAsR1JPVVAgLEFHRSwgUkFWTFRfQTcgLCBSQVZMVF9BN19aICkNCg0KcDE4IDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsQUdFLCBSQVZMVF9UT1RBTFNDT1JFICwgUkFWTFRfVE9UQUxTQ09SRV9aICkNCg0KcDE5IDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsQUdFLCBSQVZMVF9SRUMgLCBSQVZMVF9SRUNfWiApDQoNCnAyMCA8LSBkYXRhICU+JSAgc2VsZWN0KElELEVEVV9MRVZFTCAsR1JPVVAgLEFHRSwgUkFWTFRfUkVURU5USU9OICwgUkFWTFRfUkVURU5USU9OX1ogKQ0KDQpwMjEgPC0gZGF0YSAlPiUgIHNlbGVjdChJRCxFRFVfTEVWRUwgLEdST1VQICxBR0UsIFJBVkxUX1BST0FUX0lOVEVSRkVSRU5DRSAsIFJBVkxUX1BST0FUX0lOVEVSRkVSRU5DRV9aICkNCg0KcDIyIDwtIGRhdGEgJT4lICBzZWxlY3QoSUQsRURVX0xFVkVMICxHUk9VUCAsQUdFLCBSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0UgLCBSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0VfWiApDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQMTANCg0KDQpjb3Jlc1JBVkxUPC0gYygiIzdmMWMyYiIsICIjOWM5Y2U5IikNCg0KDQoNCnAxMCA8LSBkYXRhICU+JSANCiAgYXJyYW5nZShJRCkgJT4lIA0KICBtdXRhdGUodGV4dCA9IHBhc3RlKCJJZGVudGlmaWNhdGlvbjogIiwgSUQgLCAiXG5BZ2U6ICIsIEFHRSAsIA0KICAgICAgICAgICAgICAgICAgICAgICJcblBvaW50czogIiwgUkFWTFRfQTEsDQogICAgICAgICAgICAgICAgICAgICAgIlxuWi1TY29yZTogIiwgUkFWTFRfQTFfWiwgc2VwPSIiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IEFHRSwgeSA9IFJBVkxUX0ExX1osIGZpbGw9IEdST1VQLCBzdHJva2UgPSAwLA0KICAgICAgICAgICAgIHNpemUgPSBBR0UsIHNoYXBlID0gRURVX0xFVkVMICwgdGV4dCA9IHRleHQpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcscG9zaXRpb24gPSAiaml0dGVyIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb3Jlc1JBVkxUKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDIsIDUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkFnZSIsIGxpbWl0cyA9IGMoMTAsIDUyKSwgYnJlYWtzID0gc2VxKDEwLCA1MCwgYnkgPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiWiBTY29yZSIsIGxpbWl0cyA9IGMoLTMsIDMpLCBicmVha3MgPSBzZXEoLTMsIDMpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0zOjMsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjEpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gInJlZCIsIGFscGhhID0gMC4zLCBsaW5ldHlwZSA9ICIiKSArDQogIGxhYnMoeSA9ICJZIiwgdGl0bGUgPSAiWiBTY29yZSBSQVZMVCBBMSIsIHNoYXBlPSAiIiwgc2l6ZSA9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIA0KICAgIHRoZW1lKA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwgTmFycm93Iiwgc2l6ZSA9IDExLjUpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFjZSA9ICJpdGFsaWMiKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIiIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpDQogICAgKQ0KICAgIA0KDQoNCnBwMTAgPC0gZ2dwbG90bHkocDEwLCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQpwcDEwDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUDExDQoNCg0KcDExIDwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBSQVZMVF9BMiwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBSQVZMVF9BMl9aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gUkFWTFRfQTJfWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzUkFWTFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIFJBVkxUIEEyIiwgc2hhcGU9ICIiLCBzaXplID0gIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCBOYXJyb3ciLCBzaXplID0gMTEuNSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogICAgDQoNCnBwMTEgPC0gZ2dwbG90bHkocDExLCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQpwcDExDQoNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQMTINCg0KDQpwMTIgPC0gZGF0YSAlPiUgDQogIGFycmFuZ2UoSUQpICU+JSANCiAgbXV0YXRlKHRleHQgPSBwYXN0ZSgiSWRlbnRpZmljYXRpb246ICIsIElEICwgIlxuQWdlOiAiLCBBR0UgLCANCiAgICAgICAgICAgICAgICAgICAgICAiXG5Qb2ludHM6ICIsIFJBVkxUX0EzLA0KICAgICAgICAgICAgICAgICAgICAgICJcblotU2NvcmU6ICIsIFJBVkxUX0EzX1osIHNlcD0iIikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBBR0UsIHkgPSBSQVZMVF9BM19aLCBmaWxsPSBHUk9VUCwgc3Ryb2tlID0gMCwNCiAgICAgICAgICAgICBzaXplID0gQUdFLCBzaGFwZSA9IEVEVV9MRVZFTCAsIHRleHQgPSB0ZXh0KSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC43LHBvc2l0aW9uID0gImppdHRlciIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yZXNSQVZMVCkgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygyLCA1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBZ2UiLCBsaW1pdHMgPSBjKDEwLCA1MiksIGJyZWFrcyA9IHNlcSgxMCwgNTAsIGJ5ID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIlogU2NvcmUiLCBsaW1pdHMgPSBjKC0zLCAzKSwgYnJlYWtzID0gc2VxKC0zLCAzKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMzozLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC4xKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuMywgbGluZXR5cGUgPSAiIikgKw0KICBsYWJzKHkgPSAiWSIsIHRpdGxlID0gIlogU2NvcmUgUkFWTFQgQTMiLCBzaGFwZT0gIiIsIHNpemUgPSAiIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICANCiAgICB0aGVtZSgNCiAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkFyaWFsIE5hcnJvdyIsIHNpemUgPSAxMS41KSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGZhY2UgPSAiaXRhbGljIiksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICIiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KQ0KICAgICkNCiAgICANCg0KcHAxMiA8LSBnZ3Bsb3RseShwMTIsIHRvb2x0aXA9InRleHQiKSAlPiUgIA0KICANCiAgICBsYXlvdXQobGVnZW5kID0gbGlzdCh4ID0gMCwgeSA9IDEuMDEsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIgIiwNCiAgICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiI2VjZjBmMSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJ3aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aCA9IDEsDQogICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChzaXplID0gOSwgZmFtaWx5ID0gIkFyaWFsIiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gNTAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZWdyb3VwZ2FwID0gMjAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZW9yZGVyID0gIm5vcm1hbCINCiAgICAgICAgICAgICAgICAgICAgICkpDQoNCnBwMTINCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUDEzDQoNCg0KcDEzIDwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBSQVZMVF9BNCwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBSQVZMVF9BNF9aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gUkFWTFRfQTRfWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzUkFWTFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIFJBVkxUIEE0Iiwgc2hhcGU9ICIiLCBzaXplID0gIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCBOYXJyb3ciLCBzaXplID0gMTEuNSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQoNCg0KcHAxMyA8LSBnZ3Bsb3RseShwMTMsIHRvb2x0aXA9InRleHQiKSAlPiUgIA0KICANCiAgICBsYXlvdXQobGVnZW5kID0gbGlzdCh4ID0gMCwgeSA9IDEuMDEsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIgIiwNCiAgICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiI2VjZjBmMSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJ3aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aCA9IDEsDQogICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChzaXplID0gOSwgZmFtaWx5ID0gIkFyaWFsIiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gNTAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZWdyb3VwZ2FwID0gMjAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZW9yZGVyID0gIm5vcm1hbCINCiAgICAgICAgICAgICAgICAgICAgICkpDQoNCnBwMTMNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgUDE0DQoNCg0KcDE0IDwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBSQVZMVF9BNSwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBSQVZMVF9BNV9aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gUkFWTFRfQTVfWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzUkFWTFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIFJBVkxUIEE0Iiwgc2hhcGU9ICIiLCBzaXplID0gIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCBOYXJyb3ciLCBzaXplID0gMTEuNSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogICAgDQoNCnBwMTQgPC0gZ2dwbG90bHkocDE0LCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQpwcDE0DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFAxNQ0KDQoNCnAxNSA8LSBkYXRhICU+JSANCiAgYXJyYW5nZShJRCkgJT4lIA0KICBtdXRhdGUodGV4dCA9IHBhc3RlKCJJZGVudGlmaWNhdGlvbjogIiwgSUQgLCAiXG5BZ2U6ICIsIEFHRSAsIA0KICAgICAgICAgICAgICAgICAgICAgICJcblBvaW50czogIiwgUkFWTFRfQjEsDQogICAgICAgICAgICAgICAgICAgICAgIlxuWi1TY29yZTogIiwgUkFWTFRfQjFfWiwgc2VwPSIiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IEFHRSwgeSA9IFJBVkxUX0IxX1osIGZpbGw9IEdST1VQLCBzdHJva2UgPSAwLA0KICAgICAgICAgICAgIHNpemUgPSBBR0UsIHNoYXBlID0gRURVX0xFVkVMICwgdGV4dCA9IHRleHQpKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcscG9zaXRpb24gPSAiaml0dGVyIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb3Jlc1JBVkxUKSArDQogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDIsIDUpKSArDQogIHNjYWxlX3hfY29udGludW91cyhuYW1lID0gIkFnZSIsIGxpbWl0cyA9IGMoMTAsIDUyKSwgYnJlYWtzID0gc2VxKDEwLCA1MCwgYnkgPSAxMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiWiBTY29yZSIsIGxpbWl0cyA9IGMoLTMsIDMpLCBicmVha3MgPSBzZXEoLTMsIDMpKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IC0zOjMsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjEpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG9yID0gInJlZCIsIGFscGhhID0gMC4zLCBsaW5ldHlwZSA9ICIiKSArDQogIGxhYnMoeSA9ICJZIiwgdGl0bGUgPSAiWiBTY29yZSBSQVZMVCBCMSIsIHNoYXBlPSAiIiwgc2l6ZSA9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIA0KICAgIHRoZW1lKA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwgTmFycm93Iiwgc2l6ZSA9IDExLjUpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFjZSA9ICJpdGFsaWMiKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIiIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpDQogICAgKQ0KICAgIA0KDQpwcDE1IDwtIGdncGxvdGx5KHAxNSwgdG9vbHRpcD0idGV4dCIpICU+JSAgDQogIA0KICAgIGxheW91dChsZWdlbmQgPSBsaXN0KHggPSAwLCB5ID0gMS4wMSwNCiAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiAiLA0KICAgICAgICAgICAgICAgICAgICAgYmdjb2xvciA9ICIjZWNmMGYxIiwNCiAgICAgICAgICAgICAgICAgICAgIGJvcmRlcmNvbG9yID0gIndoaXRlIiwNCiAgICAgICAgICAgICAgICAgICAgIGJvcmRlcndpZHRoID0gMSwNCiAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBsaXN0KHNpemUgPSA5LCBmYW1pbHkgPSAiQXJpYWwiLCBjb2xvciA9ICJibGFjayIpLA0KICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSA1MCwNCiAgICAgICAgICAgICAgICAgICAgIHRyYWNlZ3JvdXBnYXAgPSAyMCwNCiAgICAgICAgICAgICAgICAgICAgIHRyYWNlb3JkZXIgPSAibm9ybWFsIg0KICAgICAgICAgICAgICAgICAgICAgKSkNCg0KcHAxNQ0KDQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgUDE2DQoNCg0KcDE2IDwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBSQVZMVF9BNiwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBSQVZMVF9BNl9aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gUkFWTFRfQTZfWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzUkFWTFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIFJBVkxUIEE2Iiwgc2hhcGU9ICIiLCBzaXplID0gIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCBOYXJyb3ciLCBzaXplID0gMTEuNSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogICAgDQoNCnBwMTYgPC0gZ2dwbG90bHkocDE2LCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQoNCnBwMTYNCg0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBQMTcNCg0KcDE3IDwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBSQVZMVF9BNywNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBSQVZMVF9BN19aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gUkFWTFRfQTdfWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzUkFWTFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIFJBVkxUIEE3Iiwgc2hhcGU9ICIiLCBzaXplID0gIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCBOYXJyb3ciLCBzaXplID0gMTEuNSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogICAgDQoNCnBwMTcgPC0gZ2dwbG90bHkocDE3LCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQpwcDE3DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQMTgNCg0KcDE4IDwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBSQVZMVF9UT1RBTFNDT1JFLA0KICAgICAgICAgICAgICAgICAgICAgICJcblotU2NvcmU6ICIsIFJBVkxUX1RPVEFMU0NPUkVfWiwgc2VwPSIiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IEFHRSwgeSA9IFJBVkxUX1RPVEFMU0NPUkVfWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzUkFWTFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIFJBVkxUIFRvdGFsIFNjb3JlIiwgc2hhcGU9ICIiLCBzaXplID0gIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCBOYXJyb3ciLCBzaXplID0gMTEuNSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogICAgDQoNCnBwMTggPC0gZ2dwbG90bHkocDE4LCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQpwcDE4DQoNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFAxOQ0KDQpwMTkgPC0gZGF0YSAlPiUgDQogIGFycmFuZ2UoSUQpICU+JSANCiAgbXV0YXRlKHRleHQgPSBwYXN0ZSgiSWRlbnRpZmljYXRpb246ICIsIElEICwgIlxuQWdlOiAiLCBBR0UgLCANCiAgICAgICAgICAgICAgICAgICAgICAiXG5Qb2ludHM6ICIsIFJBVkxUX1RPVEFMU0NPUkUsDQogICAgICAgICAgICAgICAgICAgICAgIlxuWi1TY29yZTogIiwgUkFWTFRfVE9UQUxTQ09SRV9aLCBzZXA9IiIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gQUdFLCB5ID0gUkFWTFRfVE9UQUxTQ09SRV9aLCBmaWxsPSBHUk9VUCwgc3Ryb2tlID0gMCwNCiAgICAgICAgICAgICBzaXplID0gQUdFLCBzaGFwZSA9IEVEVV9MRVZFTCAsIHRleHQgPSB0ZXh0KSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC43LHBvc2l0aW9uID0gImppdHRlciIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yZXNSQVZMVCkgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygyLCA1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBZ2UiLCBsaW1pdHMgPSBjKDEwLCA1MiksIGJyZWFrcyA9IHNlcSgxMCwgNTAsIGJ5ID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIlogU2NvcmUiLCBsaW1pdHMgPSBjKC0zLCAzKSwgYnJlYWtzID0gc2VxKC0zLCAzKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMzozLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC4xKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuMywgbGluZXR5cGUgPSAiIikgKw0KICBsYWJzKHkgPSAiWSIsIHRpdGxlID0gIlogU2NvcmUgUkFWTFQgVG90YWwgU2NvcmUiLCBzaGFwZT0gIiIsIHNpemUgPSAiIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICANCiAgICB0aGVtZSgNCiAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkFyaWFsIE5hcnJvdyIsIHNpemUgPSAxMS41KSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDksIGZhY2UgPSAiaXRhbGljIiksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICIiLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KQ0KICAgICkNCiAgICANCg0KcHAxOSA8LSBnZ3Bsb3RseShwMTksIHRvb2x0aXA9InRleHQiKSAlPiUgIA0KICANCiAgICBsYXlvdXQobGVnZW5kID0gbGlzdCh4ID0gMCwgeSA9IDEuMDEsDQogICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIgIiwNCiAgICAgICAgICAgICAgICAgICAgIGJnY29sb3IgPSAiI2VjZjBmMSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJjb2xvciA9ICJ3aGl0ZSIsDQogICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aCA9IDEsDQogICAgICAgICAgICAgICAgICAgICBmb250ID0gbGlzdChzaXplID0gOSwgZmFtaWx5ID0gIkFyaWFsIiwgY29sb3IgPSAiYmxhY2siKSwNCiAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gNTAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZWdyb3VwZ2FwID0gMjAsDQogICAgICAgICAgICAgICAgICAgICB0cmFjZW9yZGVyID0gIm5vcm1hbCINCiAgICAgICAgICAgICAgICAgICAgICkpDQoNCnBwMTkNCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQMjANCg0KcDIwIDwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBSQVZMVF9SRVRFTlRJT04sDQogICAgICAgICAgICAgICAgICAgICAgIlxuWi1TY29yZTogIiwgUkFWTFRfUkVURU5USU9OX1osIHNlcD0iIikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBBR0UsIHkgPSBSQVZMVF9SRVRFTlRJT05fWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzUkFWTFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIFJBVkxUIFJldGVudGlvbiIsIHNoYXBlPSAiIiwgc2l6ZSA9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIA0KICAgIHRoZW1lKA0KICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiQXJpYWwgTmFycm93Iiwgc2l6ZSA9IDExLjUpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gOSwgZmFjZSA9ICJpdGFsaWMiKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gIiIsDQogICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpDQogICAgKQ0KICAgIA0KDQoNCnBwMjAgPC0gZ2dwbG90bHkocDIwLCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQoNCnBwMjANCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFAyMQ0KDQpwMjEgPC0gZGF0YSAlPiUgDQogIGFycmFuZ2UoSUQpICU+JSANCiAgbXV0YXRlKHRleHQgPSBwYXN0ZSgiSWRlbnRpZmljYXRpb246ICIsIElEICwgIlxuQWdlOiAiLCBBR0UgLCANCiAgICAgICAgICAgICAgICAgICAgICAiXG5Qb2ludHM6ICIsIFJBVkxUX1BST0FUX0lOVEVSRkVSRU5DRSwNCiAgICAgICAgICAgICAgICAgICAgICAiXG5aLVNjb3JlOiAiLCBSQVZMVF9QUk9BVF9JTlRFUkZFUkVOQ0VfWiwgc2VwPSIiKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IEFHRSwgeSA9IFJBVkxUX1BST0FUX0lOVEVSRkVSRU5DRV9aLCBmaWxsPSBHUk9VUCwgc3Ryb2tlID0gMCwNCiAgICAgICAgICAgICBzaXplID0gQUdFLCBzaGFwZSA9IEVEVV9MRVZFTCAsIHRleHQgPSB0ZXh0KSkgKw0KICBnZW9tX3BvaW50KGFscGhhID0gMC43LHBvc2l0aW9uID0gImppdHRlciIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29yZXNSQVZMVCkgKw0KICBzY2FsZV9zaXplKHJhbmdlID0gYygyLCA1KSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBZ2UiLCBsaW1pdHMgPSBjKDEwLCA1MiksIGJyZWFrcyA9IHNlcSgxMCwgNTAsIGJ5ID0gMTApKSArDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIlogU2NvcmUiLCBsaW1pdHMgPSBjKC0zLCAzKSwgYnJlYWtzID0gc2VxKC0zLCAzKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAtMzozLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC4xKSArIA0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuMywgbGluZXR5cGUgPSAiIikgKw0KICBsYWJzKHkgPSAiWSIsIHRpdGxlID0gIlogU2NvcmUgUkFWTFQgUHJvYXRpdmUgSW50ZXJmZXJlbmNlIiwgc2hhcGU9ICIiLCBzaXplID0gIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCBOYXJyb3ciLCBzaXplID0gMTEuNSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogICAgDQoNCnBwMjEgPC0gZ2dwbG90bHkocDIxLCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQpwcDIxDQoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICBQMjINCg0KcDIyIDwtIGRhdGEgJT4lIA0KICBhcnJhbmdlKElEKSAlPiUgDQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUoIklkZW50aWZpY2F0aW9uOiAiLCBJRCAsICJcbkFnZTogIiwgQUdFICwgDQogICAgICAgICAgICAgICAgICAgICAgIlxuUG9pbnRzOiAiLCBSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0UsDQogICAgICAgICAgICAgICAgICAgICAgIlxuWi1TY29yZTogIiwgUkFWTFRfUkVUUk9fSU5URVJGRVJFTkNFX1osIHNlcD0iIikpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBBR0UsIHkgPSBSQVZMVF9SRVRST19JTlRFUkZFUkVOQ0VfWiwgZmlsbD0gR1JPVVAsIHN0cm9rZSA9IDAsDQogICAgICAgICAgICAgc2l6ZSA9IEFHRSwgc2hhcGUgPSBFRFVfTEVWRUwgLCB0ZXh0ID0gdGV4dCkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNyxwb3NpdGlvbiA9ICJqaXR0ZXIiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvcmVzUkFWTFQpICsNCiAgc2NhbGVfc2l6ZShyYW5nZSA9IGMoMiwgNSkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKG5hbWUgPSAiQWdlIiwgbGltaXRzID0gYygxMCwgNTIpLCBicmVha3MgPSBzZXEoMTAsIDUwLCBieSA9IDEwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJaIFNjb3JlIiwgbGltaXRzID0gYygtMywgMyksIGJyZWFrcyA9IHNlcSgtMywgMykpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gLTM6MywgY29sb3IgPSAiYmxhY2siLCBhbHBoYSA9IDAuMSkgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjMsIGxpbmV0eXBlID0gIiIpICsNCiAgbGFicyh5ID0gIlkiLCB0aXRsZSA9ICJaIFNjb3JlIFJBVkxUIFJldHJvYXRpdmUgSW50ZXJmZXJlbmNlIiwgc2hhcGU9ICIiLCBzaXplID0gIiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgDQogICAgdGhlbWUoDQogICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJBcmlhbCBOYXJyb3ciLCBzaXplID0gMTEuNSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA5LCBmYWNlID0gIml0YWxpYyIpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiIiwNCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSkNCiAgICApDQogICAgDQoNCnBwMjIgPC0gZ2dwbG90bHkocDIyLCB0b29sdGlwPSJ0ZXh0IikgJT4lICANCiAgDQogICAgbGF5b3V0KGxlZ2VuZCA9IGxpc3QoeCA9IDAsIHkgPSAxLjAxLA0KICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiICIsDQogICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yID0gIiNlY2YwZjEiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyY29sb3IgPSAid2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGggPSAxLA0KICAgICAgICAgICAgICAgICAgICAgZm9udCA9IGxpc3Qoc2l6ZSA9IDksIGZhbWlseSA9ICJBcmlhbCIsIGNvbG9yID0gImJsYWNrIiksDQogICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbiA9IDUwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2Vncm91cGdhcCA9IDIwLA0KICAgICAgICAgICAgICAgICAgICAgdHJhY2VvcmRlciA9ICJub3JtYWwiDQogICAgICAgICAgICAgICAgICAgICApKQ0KDQpwcDIyDQoNCg0KYGBgDQoNCg0KDQpgYGB7ciBDdXJ2YSBkZSBDcmVzY2ltZW50b30NCg0KI2luc3RhbGwucGFja2FnZXMoJ3Jlc2hhcGUyJykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkocmVzaGFwZTIpDQoNCmdldHdkKCkNCg0KDQpkZiA8LSByZWFkX2V4Y2VsKCJSQVZMVHNfRXNjb3JlWi54bHN4IikNCg0KY29sbmFtZXMoZGYpDQoNCiMxYTI4ODcsICM3OTlkZTQNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgUmVncmVzc8OjbyBMaW5lYXIgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KZGYuUkFWTFRzIDwtIGRmICU+JSBzZWxlY3QoR1JPVVAsQUdFLFJBVkxUX0ExLFJBVkxUX0EyLFJBVkxUX0EzLFJBVkxUX0E0LFJBVkxUX0E1KQ0KDQoNCmRmLm1lbHRlZCA8LSBtZWx0KGRmLlJBVkxUcywgaWQudmFycyA9IGMoIkFHRSIsICJHUk9VUCIpLCB2YXJpYWJsZS5uYW1lID0gIlZhcmnDoXZlbCIsIHZhbHVlLm5hbWUgPSAiUG9udHVhw6fDo28iKQ0KDQpjb3JlcyA8LSBjKCJDQVNFIiA9ICIjMWEyODg3IiwgIkNPTlRST0wiID0gIiM3OTlkZTQiKQ0KDQojIENyaWFyIG8gZ3LDoWZpY28gZGUgbGluaGFzDQpwIDwtIGdncGxvdChkZi5tZWx0ZWQsIGFlcyh4ID0gQUdFLCB5ID0gUG9udHVhw6fDo28sIGNvbG9yID0gR1JPVVApKSArDQogIGdlb21fcG9pbnQoYWxwaGE9MC41LCBwb3NpdGlvbiA9ICJqaXR0ZXIiLCBzaXplID0gMS41KSArDQogIHN0YXRfc21vb3RoKCBtZXRob2QgPSAibG0iLCBzcGFuID0gMC44LCBzZSA9IEYpKw0KICBsYWJzKHRpdGxlID0gIkdyw6FmaWNvIGRlIExpbmhhcyBSQVZMVCBwb3IgR3J1cG8iLA0KICAgICAgIHggPSAiQUdFIiwNCiAgICAgICB5ID0gIlBvbnR1YcOnw6NvIFJBVkxUIiwNCiAgICAgICBjb2xvciA9ICJHcnVwb3MiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb3JlcykgKw0KICBmYWNldF93cmFwKH4gVmFyacOhdmVsLCBzY2FsZXMgPSAiZnJlZV95IiwgbnJvdyA9IDEpICsgICMgU2VwYXJhw6fDo28gcG9yIEdST1VQIChjYXNvIGUgY29udHJvbGUpDQogIHRoZW1lX21pbmltYWwoKQ0KDQpwDQoNCnNoYXBpcm8udGVzdChkZi5SQVZMVHMkUkFWTFRfQTUpDQoNCmBgYA0KYGBge3IgTGluZSBQbG90fQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE3DqWRpYXMgZGUgRGVzZW1wZW5obyBwb3IgSWRhZGUgIyMjIyMjIyMjIyMjIyMjIyMNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkodGlkeXIpDQoNCmdldHdkKCkNCg0KZGF0YS5yYXZsdCA8LSByZWFkX2V4Y2VsKCJSQVZMVHNfRXNjb3JlWi54bHN4IikNCg0KZGF0YS5yYXZsdCA8LSBkYXRhLnJhdmx0ICU+JSAgc2VsZWN0KCJBR0UiLCJHUk9VUCIsIlJBVkxUX0ExIiwiUkFWTFRfQTIiLCAiUkFWTFRfQTMiLCJSQVZMVF9BNCIsICJSQVZMVF9BNSIpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCmRhdGEucmF2bHQgPC0gZGF0YS5yYXZsdCAlPiUNCiAgbXV0YXRlKA0KICAgIGZhaXhhX2V0YXJpYSA9IGNhc2Vfd2hlbigNCiAgICAgIEFHRSA+PSAxOCAmIEFHRSA8PSAyMCB+ICIxOC0yMCIsDQogICAgICBBR0UgPj0gMjEgJiBBR0UgPD0gMzAgfiAiMjEtMzAiLA0KICAgICAgQUdFID49IDIxICYgQUdFIDw9IDMwIH4gIjIxLTMwIiwNCiAgICAgIEFHRSA+PSAzMSAmIEFHRSA8PSA0MCB+ICIzMS00MCIsDQogICAgICBBR0UgPj0gNDEgJiBBR0UgPD0gNTAgfiAiNDEtNTAiLA0KICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8NCiAgICApDQogICkNCg0KbWVkaWFzX3Jhdmx0IDwtIGRhdGEucmF2bHQgJT4lDQogIGdyb3VwX2J5KEdST1VQLCBmYWl4YV9ldGFyaWEpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWFfUkFWTFRfQTEgPSBtZWFuKFJBVkxUX0ExLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lZGlhX1JBVkxUX0EyID0gbWVhbihSQVZMVF9BMiwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWRpYV9SQVZMVF9BMyA9IG1lYW4oUkFWTFRfQTMsIG5hLnJtID0gVFJVRSksDQogICAgbWVkaWFfUkFWTFRfQTQgPSBtZWFuKFJBVkxUX0E0LCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lZGlhX1JBVkxUX0E1ID0gbWVhbihSQVZMVF9BNSwgbmEucm0gPSBUUlVFKQ0KICApICU+JQ0KICB1bmdyb3VwKCkNCg0KDQptZWRpYXNfcmF2bHQNCg0KbWVkaWFzX3Jhdmx0IDwtIGRhdGEucmF2bHQgJT4lDQogIGdyb3VwX2J5KEdST1VQLCBmYWl4YV9ldGFyaWEpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWFfUkFWTFRfQTEgPSBtZWFuKFJBVkxUX0ExLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lZGlhX1JBVkxUX0EyID0gbWVhbihSQVZMVF9BMiwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWRpYV9SQVZMVF9BMyA9IG1lYW4oUkFWTFRfQTMsIG5hLnJtID0gVFJVRSksDQogICAgbWVkaWFfUkFWTFRfQTQgPSBtZWFuKFJBVkxUX0E0LCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lZGlhX1JBVkxUX0E1ID0gbWVhbihSQVZMVF9BNSwgbmEucm0gPSBUUlVFKSwNCiAgICBzZF9SQVZMVF9BMSA9IHNkKFJBVkxUX0ExLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNkX1JBVkxUX0EyID0gc2QoUkFWTFRfQTIsIG5hLnJtID0gVFJVRSksDQogICAgc2RfUkFWTFRfQTMgPSBzZChSQVZMVF9BMywgbmEucm0gPSBUUlVFKSwNCiAgICBzZF9SQVZMVF9BNCA9IHNkKFJBVkxUX0E0LCBuYS5ybSA9IFRSVUUpLA0KICAgIHNkX1JBVkxUX0E1ID0gc2QoUkFWTFRfQTUsIG5hLnJtID0gVFJVRSkNCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IHN0YXJ0c193aXRoKCJtZWRpYV8iKSwgbmFtZXNfdG8gPSAiUkFWTFQiLCB2YWx1ZXNfdG8gPSAibWVkaWEiKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgic2RfIiksIG5hbWVzX3RvID0gInNkX25hbWUiLCB2YWx1ZXNfdG8gPSAic2QiKSAlPiUNCiAgbXV0YXRlKFJBVkxUID0gZ3N1YigibWVkaWFfIiwgIiIsIFJBVkxUKSwNCiAgICAgICAgIHNkX25hbWUgPSBnc3ViKCJzZF8iLCAiIiwgc2RfbmFtZSkpICU+JQ0KICBmaWx0ZXIoUkFWTFQgPT0gc2RfbmFtZSkgJT4lDQogIHNlbGVjdCgtc2RfbmFtZSkNCg0KDQoNCnAgPC0gZ2dwbG90KG1lZGlhc19yYXZsdCwgYWVzKHggPSBmYWl4YV9ldGFyaWEsIHkgPSBtZWRpYSwgZ3JvdXAgPSBpbnRlcmFjdGlvbihHUk9VUCwgUkFWTFQpLCBjb2xvciA9IFJBVkxUKSkgKw0KICBnZW9tX2xpbmUoYWVzKGxpbmV0eXBlID0gR1JPVVApLCBzaXplID0gMSkgKyAgIyBEaWZlcmVuY2lhIG9zIGdydXBvcyBwb3IgdGlwbyBkZSBsaW5oYQ0KICBnZW9tX3BvaW50KHNpemUgPSAyKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWRpYSAtIHNkLCB5bWF4ID0gbWVkaWEgKyBzZCwgZmlsbCA9IFJBVkxUKSwgYWxwaGEgPSAwLjIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMwMTIwNEUiLCAiIzAyODM5MSIsICIjRkYwMDAwIiwgIiNGRkEyN0YiLCAiI0U1OUJFOSIpKSArICAjIFBhbGV0YSBkZSBjb3JlcyBncmFkaWVudGUgcGFyYSBSQVZMVA0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygic29saWQiLCAiZGFzaGVkIikpICsgICMgVGlwb3MgZGUgbGluaGEgcGFyYSBvcyBncnVwb3MNCiAgbGFicyh0aXRsZSA9ICJNw6lkaWFzIGRvcyBWYWxvcmVzIFJBVkxUIHBvciBHcnVwbyBlIEZhaXhhIEV0w6FyaWEiLA0KICAgICAgIHggPSAiRmFpeGEgRXTDoXJpYSIsDQogICAgICAgeSA9ICJNw6lkaWEgZG9zIFZhbG9yZXMgUkFWTFQiLA0KICAgICAgIGNvbG9yID0gIlJBVkxUIiwNCiAgICAgICBsaW5ldHlwZSA9ICJHcnVwbyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCnANCg0KDQojIENyaWFyIG8gZ3LDoWZpY28gZGUgbGluaGEgY29tIHNvbWJyYSBwYXJhIGRlc3ZpbyBwYWRyw6NvIGUgZmFjZXRfd3JhcA0KcCA8LSBnZ3Bsb3QobWVkaWFzX3Jhdmx0LCBhZXMoeCA9IGZhaXhhX2V0YXJpYSwgeSA9IG1lZGlhLCBncm91cCA9IEdST1VQLCBjb2xvciA9IEdST1VQKSkgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVkaWEgLSBzZCwgeW1heCA9IG1lZGlhICsgc2QsIGZpbGwgPSBHUk9VUCksIGFscGhhID0gMC42KSArDQogIGdlb21fbGluZShhZXMobGluZXR5cGUgPSBHUk9VUCksIHNpemUgPSAxKSArICAjIERpZmVyZW5jaWEgb3MgZ3J1cG9zIHBvciB0aXBvIGRlIGxpbmhhDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgZmFjZXRfd3JhcCh+IFJBVkxULCBzY2FsZXMgPSAiZnJlZV95IikgKyAgIyBGYWNldGEgcG9yIHZhcmnDoXZlbCBSQVZMVA0KICBzY2FsZV9saW5ldHlwZV9tYW51YWwodmFsdWVzID0gYygic29saWQiLCAiZGFzaGVkIikpICsgICMgVGlwb3MgZGUgbGluaGEgcGFyYSBvcyBncnVwb3MNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTUpKSArICAjIEFqdXN0YXIgYSBlc2NhbGEgZG8gZWl4byB5DQogIGxhYnModGl0bGUgPSAiTcOpZGlhcyBkb3MgVmFsb3JlcyBSQVZMVCBwb3IgR3J1cG8gZSBGYWl4YSBFdMOhcmlhIiwNCiAgICAgICB4ID0gIkZhaXhhIEV0w6FyaWEiLA0KICAgICAgIHkgPSAiTcOpZGlhIGRvcyBWYWxvcmVzIFJBVkxUIiwNCiAgICAgICBjb2xvciA9ICJHcnVwbyIsDQogICAgICAgZmlsbCA9ICJHcnVwbyIsDQogICAgICAgbGluZXR5cGUgPSAiR3J1cG8iKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQoNCnANCg0KYGBgDQoNCmBgYHtyfQ0KIyBjb21wYXJhbmRvIGRlIDUgZW0gNSANCg0KZGF0YS5yYXZsdCA8LSByZWFkX2V4Y2VsKCJSQVZMVHNfRXNjb3JlWi54bHN4IikNCg0KZGF0YS5yYXZsdCA8LSBkYXRhLnJhdmx0ICU+JSAgc2VsZWN0KCJBR0UiLCJHUk9VUCIsIlJBVkxUX0ExIiwiUkFWTFRfQTIiLCAiUkFWTFRfQTMiLCJSQVZMVF9BNCIsICJSQVZMVF9BNSIpDQogDQoNCmRhdGEucmF2bHQgPC0gZGF0YS5yYXZsdCAlPiUNCiAgbXV0YXRlKA0KICAgIGZhaXhhX2V0YXJpYSA9IGNhc2Vfd2hlbigNCiAgICAgIEFHRSA+PSAxOCAmIEFHRSA8PSAyMCB+ICIxOC0yMCIsDQogICAgICBBR0UgPj0gMjEgJiBBR0UgPD0gMjUgfiAiMjEtMjUiLA0KICAgICAgQUdFID49IDI2ICYgQUdFIDw9IDMwIH4gIjI2LTMwIiwNCiAgICAgIEFHRSA+PSAzMSAmIEFHRSA8PSAzNSB+ICIzMS0zNSIsDQogICAgICBBR0UgPj0gMzYgJiBBR0UgPD0gNDAgfiAiMzYtNDAiLA0KICAgICAgQUdFID49IDQxICYgQUdFIDw9IDQ1IH4gIjQxLTQ1IiwNCiAgICAgIEFHRSA+PSA0NiAmIEFHRSA8PSA1MCB+ICI0Ni01MCINCiAgICApDQogICkNCg0KI21lZGlhc19yYXZsdCA8LSBkYXRhLnJhdmx0ICU+JQ0KIyAgZ3JvdXBfYnkoR1JPVVAsIGZhaXhhX2V0YXJpYSkgJT4lDQojICBzdW1tYXJpc2UoDQojICAgIG1lZGlhX1JBVkxUX0ExID0gbWVhbihSQVZMVF9BMSwgbmEucm0gPSBUUlVFKSwNCiMgICAgbWVkaWFfUkFWTFRfQTIgPSBtZWFuKFJBVkxUX0EyLCBuYS5ybSA9IFRSVUUpLA0KIyAgICBtZWRpYV9SQVZMVF9BMyA9IG1lYW4oUkFWTFRfQTMsIG5hLnJtID0gVFJVRSksDQojICAgIG1lZGlhX1JBVkxUX0E0ID0gbWVhbihSQVZMVF9BNCwgbmEucm0gPSBUUlVFKSwNCiMgICAgbWVkaWFfUkFWTFRfQTUgPSBtZWFuKFJBVkxUX0E1LCBuYS5ybSA9IFRSVUUpDQojICApICU+JQ0KIyAgdW5ncm91cCgpDQoNCiNtZWRpYXNfcmF2bHQNCg0KbWVkaWFzX3Jhdmx0IDwtIGRhdGEucmF2bHQgJT4lDQogIGdyb3VwX2J5KEdST1VQLCBmYWl4YV9ldGFyaWEpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWFfUkFWTFRfQTEgPSBtZWFuKFJBVkxUX0ExLCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lZGlhX1JBVkxUX0EyID0gbWVhbihSQVZMVF9BMiwgbmEucm0gPSBUUlVFKSwNCiAgICBtZWRpYV9SQVZMVF9BMyA9IG1lYW4oUkFWTFRfQTMsIG5hLnJtID0gVFJVRSksDQogICAgbWVkaWFfUkFWTFRfQTQgPSBtZWFuKFJBVkxUX0E0LCBuYS5ybSA9IFRSVUUpLA0KICAgIG1lZGlhX1JBVkxUX0E1ID0gbWVhbihSQVZMVF9BNSwgbmEucm0gPSBUUlVFKSwNCiAgICBzZF9SQVZMVF9BMSA9IHNkKFJBVkxUX0ExLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNkX1JBVkxUX0EyID0gc2QoUkFWTFRfQTIsIG5hLnJtID0gVFJVRSksDQogICAgc2RfUkFWTFRfQTMgPSBzZChSQVZMVF9BMywgbmEucm0gPSBUUlVFKSwNCiAgICBzZF9SQVZMVF9BNCA9IHNkKFJBVkxUX0E0LCBuYS5ybSA9IFRSVUUpLA0KICAgIHNkX1JBVkxUX0E1ID0gc2QoUkFWTFRfQTUsIG5hLnJtID0gVFJVRSkNCiAgKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IHN0YXJ0c193aXRoKCJtZWRpYV8iKSwgbmFtZXNfdG8gPSAiUkFWTFQiLCB2YWx1ZXNfdG8gPSAibWVkaWEiKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBzdGFydHNfd2l0aCgic2RfIiksIG5hbWVzX3RvID0gInNkX25hbWUiLCB2YWx1ZXNfdG8gPSAic2QiKSAlPiUNCiAgbXV0YXRlKFJBVkxUID0gZ3N1YigibWVkaWFfIiwgIiIsIFJBVkxUKSwNCiAgICAgICAgIHNkX25hbWUgPSBnc3ViKCJzZF8iLCAiIiwgc2RfbmFtZSkpICU+JQ0KICBmaWx0ZXIoUkFWTFQgPT0gc2RfbmFtZSkgJT4lDQogIHNlbGVjdCgtc2RfbmFtZSkNCg0KDQoNCiMgQ3JpYXIgbyBncsOhZmljbyBkZSBsaW5oYSBjb20gc29tYnJhIHBhcmEgZGVzdmlvIHBhZHLDo28gZSBmYWNldF93cmFwDQpwIDwtIGdncGxvdChtZWRpYXNfcmF2bHQsIGFlcyh4ID0gZmFpeGFfZXRhcmlhLCB5ID0gbWVkaWEsIGdyb3VwID0gR1JPVVAsIGNvbG9yID0gR1JPVVApKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBtZWRpYSAtIHNkLCB5bWF4ID0gbWVkaWEgKyBzZCwgZmlsbCA9IEdST1VQKSwgYWxwaGEgPSAwLjYpICsNCiAgZ2VvbV9saW5lKGFlcyhsaW5ldHlwZSA9IEdST1VQKSwgc2l6ZSA9IDEpICsgICMgRGlmZXJlbmNpYSBvcyBncnVwb3MgcG9yIHRpcG8gZGUgbGluaGENCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBmYWNldF93cmFwKH4gUkFWTFQsIHNjYWxlcyA9ICJmcmVlX3kiKSArICAjIEZhY2V0YSBwb3IgdmFyacOhdmVsIFJBVkxUDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJzb2xpZCIsICJkYXNoZWQiKSkgKyAgIyBUaXBvcyBkZSBsaW5oYSBwYXJhIG9zIGdydXBvcw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxNSkpICsgICMgQWp1c3RhciBhIGVzY2FsYSBkbyBlaXhvIHkNCiAgbGFicyh0aXRsZSA9ICJNw6lkaWFzIGRvcyBWYWxvcmVzIFJBVkxUIHBvciBHcnVwbyBlIEZhaXhhIEV0w6FyaWEiLA0KICAgICAgIHggPSAiRmFpeGEgRXTDoXJpYSIsDQogICAgICAgeSA9ICJNw6lkaWEgZG9zIFZhbG9yZXMgUkFWTFQiLA0KICAgICAgIGNvbG9yID0gIkdydXBvIiwNCiAgICAgICBmaWxsID0gIkdydXBvIiwNCiAgICAgICBsaW5ldHlwZSA9ICJHcnVwbyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCnANCg0KDQpgYGANCg0KDQo=